वादों के साथ एकमात्र मुद्दा यह है कि IE उन्हें समर्थन नहीं करता है। एज करता है, लेकिन वहां IE 10 और 11 में से बहुत कुछ है: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (तल पर संगतता)
इसलिए, जावास्क्रिप्ट एकल-थ्रेडेड है। यदि आप एक एसिंक्रोनस कॉल नहीं कर रहे हैं, तो यह अनुमानित रूप से व्यवहार करेगा। मुख्य जावास्क्रिप्ट धागा अगले एक को निष्पादित करने से पहले एक फ़ंक्शन को पूरी तरह से निष्पादित करेगा, इस क्रम में वे कोड में दिखाई देंगे। सिंक्रोनस फ़ंक्शंस के लिए ऑर्डर की गारंटी तुच्छ है - प्रत्येक फ़ंक्शन उस आदेश में पूरी तरह से निष्पादित करेगा जो इसे कहा गया था।
कार्य की परमाणु इकाई के रूप में तुल्यकालिक कार्य के बारे में सोचो । मुख्य जावास्क्रिप्ट थ्रेड इसे पूरी तरह से निष्पादित करेगा, जिस क्रम में बयान कोड में दिखाई देंगे।
लेकिन, निम्न स्थिति में, अतुल्यकालिक कॉल में फेंक दें:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
यह वह नहीं करता है जो आप चाहते हैं । यह तुरंत फ़ंक्शन 1, फ़ंक्शन 2 और फ़ंक्शन 3 को निष्पादित करता है। डिव लोड हो रहा है और यह चला गया है, जबकि अजाक्स कॉल लगभग पूरा नहीं है, भले ही makeAjaxCall()
वापस आ गया हो। शिकायत यह है कि makeAjaxCall()
इसके काम को विखंडू में तोड़ दिया है जो कि मुख्य जावास्क्रिप्ट धागे के प्रत्येक स्पिन द्वारा थोड़ा-थोड़ा उन्नत है - यह उचित रूप से व्यवहार कर रहा है। लेकिन वही मुख्य धागा, एक स्पिन / रन के दौरान, तुल्यकालिक भागों को जल्दी और अनुमानित रूप से निष्पादित करता है।
इसलिए, जिस तरह से मैंने इसे संभाला : जैसे मैंने कहा कि कार्य की परमाणु इकाई है। मैंने फ़ंक्शन 1 और 2 के कोड को मिलाया - मैंने asynch कॉल से पहले फ़ंक्शन 2 में फ़ंक्शन 1 का कोड डाल दिया। मुझे फंक्शन से छुटकारा मिल गया। 1. अतुल्यकालिक कॉल सहित सब कुछ क्रम में, अनुमानित रूप से निष्पादित होता है।
जब, अतुल्यकालिक कॉल पूरा हो जाता है, मुख्य जावास्क्रिप्ट धागे के कई spins के बाद, यह समारोह 3 कहते हैं। यह आदेश की गारंटी देता है । उदाहरण के लिए, अजाक्स के साथ, onreadystatechange घटना हैंडलर को कई बार कहा जाता है। जब यह रिपोर्ट पूरी हो जाती है, तो अंतिम फ़ंक्शन को कॉल करें जिसे आप चाहते हैं।
मैं मानता हूं कि यह गड़बड़ है। मुझे कोड सममित होना पसंद है, मुझे पसंद है कि फ़ंक्शंस एक काम (या उसके करीब) करते हैं, और मुझे पसंद नहीं है कि किसी भी तरह से अजाक्स कॉल प्रदर्शन के लिए ज़िम्मेदार हो (कॉलर पर निर्भरता पैदा करना)। लेकिन, एसिंक्रोनस कॉल के साथ एक सिंक्रोनस फ़ंक्शन में एम्बेडेड, निष्पादन के आदेश की गारंटी के लिए समझौता करना पड़ता है। और मुझे IE 10 के लिए कोड देना है इसलिए कोई वादा नहीं किया है।
सारांश : तुल्यकालिक कॉल के लिए, गारंटी आदेश तुच्छ है। प्रत्येक फ़ंक्शन उस आदेश में पूरी तरह से निष्पादित होता है जिसे यह कहा जाता था। एक एसिंक्रोनस कॉल के साथ एक फ़ंक्शन के लिए, ऑर्डर की गारंटी देने का एकमात्र तरीका यह है कि जब एसिंक्स कॉल पूरा हो जाए, तो मॉनिटर करें और तीसरे फ़ंक्शन को कॉल करें जब उस स्थिति का पता चलता है।
जावास्क्रिप्ट धागे की चर्चा के लिए, देखें: https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 और https : //developer.mozilla.org-en-US/docs/Web/JavaScript/JavaScript EventLoop
इसके अलावा, इस विषय पर एक और समान, अत्यधिक मूल्यांकन किया गया प्रश्न: मुझे एक के बाद एक निष्पादित करने के लिए 3 कार्यों को कैसे कॉल करना चाहिए?
firstFunction
वास्तव में ऐसा क्या है जो इसे अतुल्यकालिक बनाता है? किसी भी तरह से - वादों के बारे में जाँच करें