我的程序需要运行许多异步任务。
当所有异步任务完成时,必须运行一项任务。
如何让这个函数等待所有异步函数?
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')
}
答案 0 :(得分:7)
承诺正是您所需要的。它们现在在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();
答案 1 :(得分:4)
不需要使用promises重写所有内容的最简单的解决方案是在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')
}