javascript - जावास्क्रिप्ट ES6 प्रॉमिस एक संकल्प के बाद निष्पादन क्यों जारी रखता है?




promise ecmascript-6 (2)

जब आप किसी वादे को resolve करते हैं, तो कॉलबैक को अभी भी विनिर्देश द्वारा अतुल्यकालिक रूप से बुलाया जाना आवश्यक है। यह सिंक्रोनस और एसिंक्रोनस क्रियाओं के मिश्रण के लिए वादों का उपयोग करते समय लगातार व्यवहार सुनिश्चित करना है।

इसलिए जब आप resolve आह्वान करते हैं तो कॉलबैक पंक्तिबद्ध होता है , और resolve() कॉल के बाद फ़ंक्शन निष्पादन तुरंत किसी भी कोड के साथ जारी रहता है।

केवल एक बार जेएस ईवेंट लूप वापस दिए जाने के बाद कॉलबैक को कतार से हटाया जा सकता है और वास्तव में लागू किया जा सकता है।

जैसा कि मैं समझता हूं कि एक वादा कुछ ऐसा है जो हल कर सकता है () या अस्वीकार () लेकिन मुझे यह पता लगाने के लिए आश्चर्य हुआ कि वादा में कोड एक संकल्प या अस्वीकार के बाद निष्पादित करना जारी है।

मैंने संकल्प किया या बाहर निकलने या वापसी का एक async-अनुकूल संस्करण होने को अस्वीकार कर दिया, जो सभी तत्काल कार्य निष्पादन को रोक देगा।

क्या कोई व्यक्ति इसके पीछे के विचार को समझा सकता है कि निम्न उदाहरण कभी-कभी एक समाधान कॉल के बाद कंसोल को प्रदर्शित करता है:

var call = function() {
    return new Promise(function(resolve, reject) {
        resolve();
        console.log("Doing more stuff, should not be visible after a resolve!");
    });
};

call().then(function() {
    console.log("resolved");
});

jsbin


जावास्क्रिप्ट में "रन टू पूरा" की अवधारणा है। जब तक कोई त्रुटि नहीं दी जाती है, तब तक एक फ़ंक्शन को तब तक निष्पादित किया जाता है जब तक कि return स्टेटमेंट या उसके अंत तक नहीं पहुंच जाता है। फ़ंक्शन के बाहर अन्य कोड उस के साथ हस्तक्षेप नहीं कर सकते (जब तक, फिर से, एक त्रुटि फेंक दी जाती है)।

यदि आप अपने प्रारंभिक कार्य से बाहर निकलने का resolve() चाहते हैं, तो आपको इसे return भेजना होगा:

return new Promise(function(resolve, reject) {
    return resolve();
    console.log("Not doing more stuff after a return statement");
});




es6-promise