【问题标题】:How to wait for all async tasks to finish in Node.js?如何在 Node.js 中等待所有异步任务完成?
【发布时间】:2017-03-31 15:53:04
【问题描述】:

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

当所有异步任务完成时,必须运行一项任务。

如何让这个函数等待所有异步函数?

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

【问题讨论】:

标签: javascript node.js asynchronous


【解决方案1】:

Promise 正是您所需要的。它们现在是 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();

【讨论】:

  • 如果您只是将finish() 包装在.then()Promise.all(urls.map(doRequest)).then(finish) 中,则不需要异步等待语法。还是很喜欢这个答案。
  • 我写了这两个解决方案,你读得太快了,错过了一行:) 我介绍了 async-await 语法,因为它在其他情况下很方便。
  • 我也喜欢await Promise.all(...),因为它物有所值。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2013-03-28
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多