jquery - How do I cancel a promise inside the "done" callback? -


मेरे पास निम्न परिदृश्य है ...

  $। जब ($ .getScript ( 'script.js')) .done (function () {if (scriptIsAlreadyLoaded) {// मैं यह वादा रद्द करना चाहता हूं। // मुझे अब script.js नहीं चाहिए क्योंकि // यह पहले से एक अन्य / उदाहरण में लोड हो चुका है ।} // मैं नहीं चाहता हूं कि यह ऊपर चलने के लिए अगर उपरोक्त // स्थिति सही है। DoStuff ();});   

मैं समझता हूं कि यह done () के अंदर करने से परिभाषा के बाद से ज्यादा मायने नहीं रखता, यह वादा रद्द करने में बहुत देर हो चुकी है।

तो यहां सबसे अच्छा तरीका क्या होगा?

नोट: इस स्निपेट को कई बार निष्पादित किया जा सकता है। यही कारण है कि मैं स्क्रिप्ट को एक से अधिक बार लोड होने से बचना चाहता हूं।

यह .done () हैंडलर के अंदर एक वादा रद्द करने का कोई मतलब नहीं है। जब .done () हैंडलर को कहा जाता है कि ऑपरेशन पहले से ही पूर्ण है (ऐसा लगता है कि आप पहले से ही जानते हैं)। इसलिए, जब आपका .done () हैंडलर कहलाता है, तो आपकी स्क्रिप्ट का लोड पहले ही पूरा हो चुका है। रद्द करने के लिए कुछ भी नहीं बचा है।

अगर आप अपने कोड को स्क्रिप्ट को कई बार लोड करने की कोशिश करने से रोकना चाहते हैं, तो आप इसके लिए वास्तव में वादे नहीं करते हैं आप सिर्फ अपने झंडे का ट्रैक रख सकते हैं या आप पर्यावरण की जांच कर सकते हैं कि क्या स्क्रिप्ट पहले ही मौजूद है। उदाहरण के लिए, आप इस फ़ंक्शन का उपयोग कर सकते हैं जो यह देखने के लिए जांचता है कि क्या पहले से ही एक स्क्रिप्ट टैग लोड हो रहा है जो किसी विशेष फाइल नाम के साथ समाप्त होता है:

  फ़ंक्शन isScriptPresent (fname) {var regex = new RegExp (fname) + "$"); Var लिपियों = दस्तावेज़.getElementsByTagName ("स्क्रिप्ट"); के लिए (var i = 0; i & lt; scripts.length; i ++) {if (regex.test (स्क्रिप्ट [i] .src)) {वापस सत्य; } } विवरण झूठा है; } यदि (! isScriptPresent ("script.js")) {$ .getScript ("script.js"); }   

या, आप अपनी खुद की होक्सस्क्रिप्ट फ़ंक्शन बना सकते हैं जो पहले यह देखने के लिए जांचें कि क्या वह पहले ही लोड हो चुका था:

  $। getScriptIfNotLoaded = function (fname) ) {If (! IsScriptPresent (fname)) {वापसी $ .getScript (fname); }}   

फिर, आप बस ऐसा कर सकते हैं:

  $। getScriptIfNotLoaded ("script.js");   

और, यह एक ही पृष्ठ में कई बार कभी भी लोड नहीं किया जाएगा। इसका फायदा यह है कि इससे कोई फर्क नहीं पड़ता कि स्क्रिप्ट पहले कैसे भरी हुई थी (भले ही वह मूल HTML में था) - यह उसे मिलेगा यदि वह पहले से ही पृष्ठ में है।


आप यह भी सिर्फ एक नक्शे में लोड किया गया है का ट्रैक रखें:

  (function () {var loadedScripts = {}; $ .लोडस्क्रिप्टऑन = फ़ंक्शन (fname) {if (! loadedScripts [fname] ) {loadedScripts [fname] = सच; वापसी $ .getScript (fname);}};}) (); $ .loadScriptOnce ( "scripts.js");    

Comments

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -