简体   繁体   English

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

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

My program needs to run many async tasks. 我的程序需要运行许多异步任务。

And one task must run when all async tasks complete. 所有异步任务完成后,必须运行一项任务。

How can I make this function to wait all async functions? 如何让这个函数等待所有异步函数?

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')
}

Promise are exactly what you need. 承诺正是您所需要的。 They're native in JS nowadays, no need for extra libraries. 它们现在在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();

The easiest solution that doesn't require rewriting everything using promises, would be to check the number of completed requests at the end of doRequest function, and call finish if all requests have been completed. 不需要使用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