2017-02-08 19 views
10

मैं मान लीजिए निम्नलिखित Promise:एक वादा का शरीर कब निष्पादित किया जाता है?

function doSomethingAsynchronous() { 
    return new Promise((resolve) => { 
    const result = doSomeWork(); 

    setTimeout(() => { 
     resolve(result); 
    }), 100); 
    }); 
} 

समय में जो बिंदु पर doSomeWork() कहा जाता है? क्या यह तुरंत Promise के निर्माण के बाद है? यदि नहीं, तो क्या यह सुनिश्चित करने के लिए कुछ अतिरिक्त अतिरिक्त है कि Promise का शरीर चलाया जाए?

+2

[ईसीएमएस्क्रिप्ट, 25.4.3.1 'वादा (निष्पादक) '] (http://www.ecma-international.org/ecma-262/6.0/#sec-promise-executor) -> चरण 9 – Andreas

+0

यह' कोई फर्क नहीं पड़ता: यदि आपको संचालन के आदेश को लागू करने की आवश्यकता है, तो स्पष्ट रूप से ऐसा करें। विभिन्न कार्यान्वयन व्यवहार में मामूली अंतर के साथ वादे को संभालेगा (उदाहरण के लिए, ब्लूबर्ड बनाम मूल मानचित्र)। – ssube

+0

आप क्या हासिल करने की कोशिश कर रहे हैं? – guest271314

उत्तर

12

तत्काल, हाँ, विनिर्देशन द्वारा।

the MDN से

:

निष्पादक समारोह वादा कार्यान्वयन द्वारा तुरंत क्रियान्वित किया जाता है, संकल्प पारित करने और कार्य (से पहले वादा निर्माता भी बनाया ऑब्जेक्ट निष्पादक कहा जाता है)

अस्वीकार यहां यह ईसीएमएस्क्रिप्ट विनिर्देशन में है (निश्चित रूप से पढ़ने के लिए कठिन ...): http://www.ecma-international.org/ecma-262/6.0/#sec-promise-executor

यह गारंटी महत्वपूर्ण हो सकती है, उदाहरण के लिए जब आप तैयार हों कई वादों के बाद आप all या race पर जाते हैं, या जब आपके निष्पादकों के पास सिंक्रोनस साइड इफेक्ट होते हैं।

+1

_Imedimediately_ भ्रमित है। वादा कन्स्ट्रक्टर द्वारा निष्पादक को वास्तव में ** सिंक्रनाइज़ ** कहा जाता है। – Paleo

1

हां, जब आप वादा करते हैं तो पहला पैरामीटर तत्काल निष्पादित हो जाता है।

सामान्य रूप से, आप वास्तव में आपके द्वारा किए गए तरीके से एक वादा का उपयोग नहीं करेंगे, जैसा कि आपके वर्तमान कार्यान्वयन के साथ, यह अभी भी तुल्यकालिक होगा।

आप बल्कि एक समय समाप्ति के साथ इसे लागू होता है, या एक ajax कॉलबैक

function doSomethingAsynchronous() { 
    return new Promise((resolve) => { 
    setTimeout(function() { 
     const result = doSomeWork(); 
     resolve(result); 
    }, 0); 
    }); 
} 

setTimeout विधि तो अगले संभव पल में समारोह कहेंगे के हिस्से के रूप संकल्प फ़ंक्शन को कॉल घटना कतार नि: शुल्क है

-1

हां, क्योंकि कॉल सिंक्रोनस है, इसे किसी भी ".then" या ".catch" को जोड़ने से पहले तुरंत कहा जाएगा।

वचन पहले से ही ".then" संलग्न होने के समय से हल हो जाएगा और यह तुरंत समाधान मान को पार कर जाएगा।

+0

क्या शरीर तुल्यकालिक है या async कोई फर्क नहीं पड़ता। वादा कन्स्ट्रक्टर व्यवहार को नहीं जानता और नहीं बदलेगा। – ssube

+0

हां, लेकिन अगर doomeWork() एक कॉलबैक है तो इसे तत्काल नहीं कहा जाएगा। – epiqueras

संबंधित मुद्दे