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

我的程序需要运行许多asynchronous任务。

当所有asynchronous任务完成时,一个任务必须运行。

如何让这个函数等待所有的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 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(); 

最简单的解决scheme不需要使用promise来重写所有内容,而是在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') }