簡體   English   中英

如何等待所有異步任務在Node.js中完成?

[英]How to wait for all async tasks to finish in Node.js?

我的程序需要運行許多異步任務。

所有異步任務完成后,必須運行一項任務。

如何讓這個函數等待所有異步函數?

let urls=[....]

for(var i=0; i<urls.length; i++){
    doRequest(urls[i])
}
finish()



function doRequest(url){
    request({
      uri: url,
    }, function(error, response, body) {
        //do some tasks
    });
}

function finish(){
    console.log('finish')
}

承諾正是您所需要的。 它們現在在JS中是原生的,不需要額外的庫。

function finish () {
    console.log("finish");
}

function doRequest (uri) {
    // wrap code in promise
    return new Promise((resolve, reject) => {
        request(
            { uri },
            (error, response, body) => {
                if (error) {
                    // error case, similar to "throw"
                    reject(error);
                }
                else {
                    // success case, similar to "return"
                    resolve({ response, body });
                }
            }
        );
    });
}

let urls=[...];

// Basic way to do it:
Promise.all(urls.map(doRequest)).then(finish);

// async/await notation:
// you must be in an "async" environement to use "await"
async function wrapper () {
    await Promise.all(urls.map(doRequest));
    finish();
}
// async function return a promise transparently
wrapper();

不需要使用promises重寫所有內容的最簡單的解決方案是在doRequest函數結束時檢查已完成請求的數量,如果所有請求都已finish則調用finish

let urls=[....]
let completed = 0

for(var i=0; i<urls.length; i++){
    doRequest(urls[i])
}

function doRequest(url){
    request({
        uri: url,
    }, function(error, response, body) {
        //do some tasks

        completed++
        if (completed === urls.length) {
            finish()
        }
    });
}

function finish(){
    console.log('finish')
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM