मैंने कुछ फ़ंक्शंस बनाए जिनमें वादे शामिल हैं और उन्हें जंजीर देने की कोशिश की। सब कुछ उम्मीद के मुताबिक काम करता है

function foo1() {
     return new Promise((resolve, reject) => {
         setTimeout(() => {
           console.log("11111") 
           resolve()
         }, 4000);
     }).then(() => {
          console.log("222222")
     })
}

function foo2() {
     new Promise(resolve => {
           setTimeout(() => {
               console.log("3333")
               resolve()
           }, 3000)
     })
}

foo1().then(() => foo2())

// "1111"
// "2222"
// "3333"

अगर मैं वही चीज़ async/प्रतीक्षा करता हूं, तो यह अपेक्षा के अनुरूप भी काम करता है:


async function testAsync() {
    let one   = await foo1();
    let two   = await foo2();
}

// "1111"
// "2222"
// "3333"

मुझे पता है कि async फ़ंक्शन एक वादा लौटाते हैं इसलिए मैंने निम्नलिखित की कोशिश की:

testAsync().then(() => {
     console.log("FINISHED");
})

लेकिन परिणाम था:

// "1111"
// "2222"
// "FINISHED"
// "3333"

"FINISHED" को "3333" से आगे क्यों निष्पादित किया जाएगा?

1
RicardoAlvveroa 19 पद 2020, 09:49

1 उत्तर

सबसे बढ़िया उत्तर

आपका foo2 फ़ंक्शन कोई वादा नहीं लौटाता, बस अपरिभाषित लौटाता है।

इसलिए आपको "3333" से पहले "FINISHED" दिखाई दे रहा है

अगर foo2 नीचे जैसा दिखता है, तो यह आपकी इच्छानुसार काम करेगा।

function foo2() {
    return new Promise(resolve => {
        setTimeout(() => {
            console.log("3333")
            resolve()
        }, 3000)
    })
}
1
roa 19 पद 2020, 10:33
शुक्रिया। क्या एक एसिंक्स फ़ंक्शन स्वाभाविक रूप से एक वादा वापस नहीं करता है? अगर कुछ भी जंजीर में नहीं है तो foo2 को एक वादा वापस करने की आवश्यकता क्यों होगी?
 – 
RicardoAlvveroa
19 पद 2020, 23:54
भले ही आप foo2 के सामने async संलग्न करते हैं, foo2 fulfilled Promise लौटाएगा जो तुरंत वापस आ जाएगा। तो, परिणाम वही होगा। आपको pending Promise लौटना चाहिए।
 – 
roa
20 पद 2020, 04:13