2017-08-03 8 views
8

मेरे पास दो async फ़ंक्शन हैं। वे दोनों दो 3 सेकंड फ़ंक्शन कॉल की प्रतीक्षा कर रहे हैं। लेकिन दूसरा एक पहले से तेज है। मुझे लगता है कि तेजी से एक समानांतर में चल रहा है और दूसरे धारावाहिक में चल रहा है। क्या मेरी धारणा सही है? यदि हां, यह क्यों हो रहा है क्योंकि दोनों कार्य तर्कसंगत रूप से समान दिखते हैं?सीरियल और समानांतर में एसिंक/प्रतीक्षा कैसे काम कर रहा है?

function sleep() { 
    return new Promise(resolve => { 
    setTimeout(resolve, 3000); 
    }); 
} 

async function serial() { 
    await sleep(); 
    await sleep(); 
} 

async function parallel() { 
    var a = sleep(); 
    var b = sleep(); 
    await a; 
    await b; 
} 

serial().then(() => { 
    console.log("6 seconds over"); 
}); 

parallel().then(() => { 
    console.log("3 seconds over"); 
}); 
+0

आपको लगता है कि 'setTimeout' async क्यों है? फ़ंक्शन घोषणाओं को छोड़कर आपके कोड में async कुछ भी नहीं है। – Mjh

+3

@Mjh Errm, 'setTimeout' इसकी प्रकृति असीमित है ... और ओपी के कोड में बहुत कुछ और भी अतुल्यकालिक है ... – Frxstrem

+2

@Frxstrem' setTimeout' को छोड़कर बिल्कुल समकालिक नहीं है। यह एक सिंक्रोनस फ़ंक्शन है जो ईवेंट लूप को बाद में फ़ंक्शन निष्पादित करने के लिए कहता है।यह एक * तंत्र * है, इस कोड में बिल्कुल अतुल्यकालिक नहीं है। विभिन्न निष्पादन संदर्भों में, कौन से दो चलती हिस्से अलग-अलग गति से आगे बढ़ रहे हैं? शून्य। इसलिए, यह कोड बिल्कुल async नहीं है। – Mjh

उत्तर

4

फ्रैक्सस्ट्रीम में पहले से ही an excellent answer है। उस पर निर्माण करने के लिए, और कुछ परिप्रेक्ष्य प्रदान करें:

पहचानने वाली पहली बात यह है कि वादे को "गर्म" बनाया जाता है - यानी, जब तक आपके पास वादा वस्तु होती है, यह पहले से ही "प्रगति पर है"।

दूसरी महत्वपूर्ण अवधारणा यह है कि await "असीमित प्रतीक्षा" की तरह है - यानी, यह कार्य पूरा होने तक फ़ंक्शन निष्पादन को रोक देता है।

तो, serial फ़ंक्शन sleep पर कॉल करता है, एक वादा वापस आता है, और फिर (असीमित रूप से) उस वादे को पूरा करने की प्रतीक्षा करता है। उस वचन के बाद 3 सेकंड बाद पूरा हो जाता है, serial फिर से sleep पर कॉल करता है, एक वादा वापस आता है, और फिर (असीमित रूप से) उस वादे को पूरा करने की प्रतीक्षा करता है। उस वचन के बाद 3 सेकंड बाद पूरा हो जाता है, serial पूरा हो जाता है।

parallel समारोह sleep कॉल और a में अपने वादे को संग्रहीत करता है, और फिर sleep कॉल और b में अपने वादे को संग्रहीत करता है, और उसके बाद (अतुल्यकालिक रूप से) को पूरा करने के a के लिए इंतजार कर रहा है। a के बाद 3 सेकंड बाद पूरा हो जाता है, parallel (असीमित रूप से) पूरा करने के लिए b के लिए प्रतीक्षा करता है। b के बाद व्यावहारिक रूप से तुरंत पूरा हो जाता है, parallel पूर्ण हो जाता है।

6

यह स्पष्ट है अगर आप अपने serial समारोह को इस प्रकार लिख:

async function serial() { 
    var a = sleep(); // 
    await a;   // await sleep(); 

    var b = sleep(); // 
    await b;   // await sleep(); 
} 

async function parallel() { 
    var a = sleep(); 
    var b = sleep(); 
    await a; 
    await b; 
} 
यहाँ आप स्पष्ट रूप से देख सकते हैं कि serial समारोह में, दूसरा sleep() केवल पहले sleep() पूरा कर लिया है के बाद कहा जाता है, जबकि

parallel में इसे पहले पूरा करने से पहले तुरंत कहा जाता है, और फिर यह दोनों को पूरा करने की प्रतीक्षा करता है। इसलिए जब वे देख सकते हैं कार्यात्मक रूप से समान, वे काफी अलग हैं।

3

क्योंकि sleep() समारोह एक तुल्यकालिक समारोह है, यह सिर्फ एक अतुल्यकालिक वादा लौटने के लिए, उदाहरण के लिए:

function sleep (time) { 
    return new Promise((resolve) => setTimeout(resolve, time)); 
} 

parallel() में, दो sleep() तुल्यकालिक दो init वादा, वे तब तक हल किया जा करने के लिए इंतजार है, यह जा रहा है लगभग 3 एस हो।

हालांकि, serial() में, दो await sleep() मतलब यह है कि दूसरे sleep() वादा पहले sleep() के लिए इंतज़ार करना होगा हल किया जाना है, इसलिए यह 6s के बारे में होने जा रहा है।

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