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

Javascript 如何在Node.js中等待所有异步任务完成?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我的程序需要运行许多异步任务 所有异步任务完成后,必须运行一个任务 如何使此函数等待所有异步函数 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 s

我的程序需要运行许多异步任务

所有异步任务完成后,必须运行一个任务

如何使此函数等待所有异步函数

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')
}
让URL=[…]

for(var i=0;iPromise正是您所需要的。它们现在是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();

不需要使用承诺重写所有内容的最简单解决方案是在
doRequest
函数末尾检查已完成请求的数量,如果所有请求都已完成,则调用
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')
}
让URL=[…]
设已完成=0

对于(var i=0;i^与不返回承诺的for nodeback api配合使用效果很好。将
i
传递到
doRequest
,以及
length
,并在每个回调上进行比较。您可以签出async.瀑布,不过根据您的需要可以选择一些:如果您只是将
finish()
,看它值多少钱。