2015-06-29 13 views
9

मेरे पास एक ऐसा फ़ंक्शन है जो वादा करता है, और मैं इसे एसिंक फ़ंक्शन के भीतर से प्रतीक्षा करने का प्रयास कर रहा हूं। समस्या यह है कि कार्यक्रम वादे का इंतजार करने के बजाय तुरंत पूरा हो जाता है।एसिंक फ़ंक्शन पूरा होने से पहले नोड निकलता है

async-test.js:

function doItSlow() { 
    const deferred = new Promise(); 

    setTimeout(() => { 
     console.log("resolving"); 
     deferred.resolve(); 
    }, 1000); 

    return deferred; 
} 

async function waitForIt(done) { 

    console.log("awaiting"); 
    await doItSlow(); 
    console.log("awaited"); 
    done(); 
} 

waitForIt(() => { 
    console.log("completed test"); 
}); 

console.log("passed by the test"); 

बिल्ड और चलाएँ:

babel --stage 0 --optional runtime async-test.js > at.js && node at.js` 

परिणाम:

:

awaiting 
passed by the test 

एक सेकंड इंतजार कर के बजाय तुरंत समाधान किया जा रहा कोई प्रभाव नहीं है

function doItSlow() { 
    const deferred = new Promise(); 

    console.log("resolving"); 
    deferred.resolve(); 

    return deferred; 
} 

दिलचस्प बात यह है "के समाधान" छपा है कभी नहीं, भले ही यह अब तुल्यकालिक है:

awaiting 
passed by the test 

मैं एक संकलक समस्या पर शक है, लेकिन मैं कोलाहल के उत्पादन और यह सुनिश्चित करें पर्याप्त जाँच की है, यह तुल्यकालिक संस्करण संकलन किया था।

मैंने सोचा कि मैं सिर्फ एसिंक फ़ंक्शन के भीतर से एक वादे का इंतजार कर सकता हूं। क्या वहां कुछ ऐसा है, जिसकी कमी मुझे यहां खल रही है?

उत्तर

7

आप Promise का उपयोग नहीं कर रहे हैं (मान लें कि यह मानक अनुपालन है)। इसमें resolve विधि नहीं है। आपको इसके बजाय एक फ़ंक्शन पास करना चाहिए:

function doItSlow() { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     console.log("resolving"); 
     resolve(); 
    }, 1000); 
    }); 
} 
संबंधित मुद्दे