चाहे promise.resolve()
सिंक्रनाइज़ हो या असीमित रूप से इसकी निरंतरता निष्पादित करे, वास्तव में कार्यान्वयन पर निर्भर करता है।
इसके अलावा, "इवेंट लूप" एक अलग "निष्पादन संदर्भ" प्रदान करने वाला एकमात्र तंत्र नहीं है। अन्य साधन हो सकते हैं, उदाहरण के लिए धागे या थ्रेड पूल, या जीसीडी (ग्रांड सेंट्रल डिस्पैच, प्रेषण lib) के बारे में सोचें, जो प्रेषण कतार प्रदान करता है।
The Promises/A+ Spec स्पष्ट रूप से की आवश्यकता है कि निरंतरता (onFulfilled
क्रमशः onRejected
हैंडलर) हो जाएगा एसिंक्रोनस रूप "निष्पादन संदर्भ" जहां then
विधि शुरू हो जाती है के संबंध में फांसी दे दी।
onFulfilled
या onRejected
तक निष्पादन संदर्भ ढेर केवल मंच कोड शामिल नहीं कहा जाना चाहिए। [3.1]।
नोट्स के तहत आप पढ़ सकते हैं कि क्या वास्तव में मतलब है:
यहाँ "मंच कोड" इंजन, पर्यावरण, और वादा कार्यान्वयन कोड का मतलब है। व्यावहारिक रूप से, यह आवश्यकता सुनिश्चित करती है कि पूर्ण और ऑन-इंजेक्शन निष्पादित रूप से निष्पादित हो जाए, ईवेंट लूप बारी के बाद जिसे फिर कहा जाता है, और एक ताजा ढेर के साथ।
यहाँ, प्रत्येक घटना एक अलग "निष्पादन संदर्भ" पर निष्पादित किया जाएगा, भले ही यह एक ही घटना पाश है, और एक ही "सूत्र"।
के बाद से वादे/ए + विनिर्देश जावास्क्रिप्ट पर्यावरण के लिए लिखा है, एक अधिक सामान्य विनिर्देश बस की आवश्यकता होगी कि निरंतरता हो जाएगा एसिंक्रोनस रूप फोन करने वाले then
विधि लागू करने के लिए सम्मान के साथ फांसी दे दी।
इस तरह से इसके अच्छे कारण हैं!
उदाहरण (छद्म कोड):
promise = async_task();
printf("a");
promise.then((int result){
printf("b");
});
printf("c");
मानते हुए, हैंडलर (निरंतरता) कॉल-साइट के समान धागे पर निष्पादित करेंगे, निष्पादन के आदेश होना चाहिए कि सांत्वना यह दिखाता है:
acb
विशेष रूप से, जब एक वादा पहले से ही हल हो गई है, कुछ कार्यान्वयन निरंतरता "तत्काल" (कि तुल्यकालिक है) एक ही निष्पादन संदर्भ पर आह्वान करने के लिए करते हैं। यह स्पष्ट रूप से ऊपर वर्णित नियम का उल्लंघन करेगा।
नियम निरंतरता आह्वान करने के लिए के लिए कारण हमेशा एसिंक्रोनस रूप कि एक कॉल-साइट किसी भी परिदृश्य में निरंतरता बयान सहित then
निम्नलिखित संचालकों के निष्पादन और कोड के रिश्तेदार आदेश के बारे में गारंटी की जरूरत है। इससे कोई फर्क नहीं पड़ता कि कोई वादा पहले ही हल हो चुका है या नहीं, बयानों के निष्पादन का आदेश वही होना चाहिए। अन्यथा, अधिक जटिल एसिंक्रोनस सिस्टम विश्वसनीय काम नहीं कर सकते हैं।
अन्य भाषाओं में कार्यान्वयन के लिए एक और खराब डिजाइन विकल्प जिसमें एकाधिक एक साथ निष्पादन संदर्भ होते हैं - एक बहु थ्रेडेड वातावरण (जावास्क्रिप्ट में अप्रासंगिक, क्योंकि निष्पादन का केवल एक धागा है) कहता है कि निरंतरता सिंक्रनाइज़ेशन की जाएगीresolve
फ़ंक्शन के संबंध में। यह भी समस्याग्रस्त है जब एसिंक्रोनस कार्य बाद के ईवेंट लूप चक्र में समाप्त हो जाएगा और इस प्रकार निरंतरता को कॉल-साइट के संबंध में असीमित रूप से निष्पादित किया जाएगा।
हालांकि, जब resolve
समारोह अतुल्यकालिक कार्य जब यह समाप्त हो गया है द्वारा सक्रिय किया जाएगा, इस काम के लिए एक निजी निष्पादन संदर्भ पर निष्पादित कर सकते हैं ("कार्यकर्ता सूत्र" कहते हैं)।यह "वर्कर थ्रेड" आमतौर पर समर्पित और संभवतः विशेष कॉन्फ़िगर किया गया निष्पादन संदर्भ - जो तब resolve
पर कॉल करेगा। यदि resolve
फ़ंक्शन सिंक्रनाइज़ निरंतरता निष्पादित करेगा, तो निरंतरता कार्य के निजी निष्पादन संदर्भ पर चलती है - जो आमतौर पर वांछित नहीं होती है।
यदि आप तुरंत एक वादा हल करना चाहते हैं, तो आप केवल 'promise.resolve()' पर कॉल करें और वह उस समय किसी भी पंजीकृत हल करने वाले हैंडलर को कॉल करेगा। यदि आप वादा को हल करने से पहले अपने स्वयं के इवेंट लूप को खोलने के लिए चाहते हैं, तो आप 'setTimeout (function() {promise.resolve()}, 10) कर सकते हैं; '। लेकिन, यह इस बात पर निर्भर करता है कि आप '.resolve()' व्यवहार करना चाहते हैं। 'SetTimeout() 'का उपयोग करने की आवश्यकता नहीं है। – jfriend00
हाँ, मैं समझता हूं। मैं समझना चाहता हूं कि सेटटाइमआउट का उपयोग करते समय, 10 मिलीसेकंड्स foo() के तुरंत बाद नहीं कहा जाता है, लेकिन इसके बजाय संकल्प को कतार में रखा जाता है और foo() कुछ समय बाद निष्पादित किया जाता है। – silentorb
कौन सा वादा कार्यान्वयन करता है? कई अलग-अलग कार्यान्वयन हैं इसलिए विशिष्ट कार्यान्वयन के संदर्भ में इस तरह के एक प्रश्न पूछना मुश्किल है। जहां तक मुझे पता है, वहां कोई विनिर्देश नहीं है जो कहता है कि देरी के बाद तक कॉलबैक को हल नहीं किया जाना चाहिए। – jfriend00