javascript - 如何等到循环内的异步进程完成后再退出循环?

标签 javascript node.js mongodb loops asynchronous

我有一些异步代码在 JavaScript forEach 循环内运行。我想等到异步进程内的代码完成运行后再继续循环。

示例如下:

ids 是一个字符串数组。 db 是我为使用 MongoDB 创建的 Node 模块

var appIdsNotFound = "";
var count = 0;
ids.forEach(function(id) {
    output[count] = {};
    //console.log(id);
    db.findApp(id, function(error, result) {
        if(error) {
            fatalError = true;
            console.log(error);
        } else {
            if (result) {
                output[count] = result;
                //console.log(output[count]);
                count++;
            } else {
                appNotFound = true;
                appIdsNotFound += id + ", ";
                console.log(appIdsNotFound);
            }
        }
    });
});

//more code that we want to wait before executing

有没有办法在执行循环之外的其余代码之前等待,如果是的话,我将如何去做。

最佳答案

  1. 假设db是访问数据库的某个模块,请尝试查找同步版本。这假设您可以使用同步,因为您正在尝试以这种方式编写它,等待一切然后再继续。

  2. 如果您的数据库库使用 Promise,您可以将其与 Promise.all 结合使用。对每个项目发出一个请求,将所有 Promise 收集到一个数组中,并将它们提供给 Promise.all。当所有 promise 都解决时,来自 Promise.all 的 promise 将得到解决。

    const promises = ids.map(id => db.promiseReturningFindApp(id));
    const allRequests = Promise.all(promises).then(responses => {
      // responses is an array of all results
    });
    
  3. 如果您的 API 没有 promise 返回版本,请将 db.findApp 包装在 promise 中,请执行建议 #2。

    function promiseReturningFindApp(id){
      return new Promise((resolve, reject) => {
        db.findApp(id, (error, result) => {
          if(error) reject(error);
          else resolve(result);
        });
      });
    }
    

选项 2 和 3 是异步的,因此,从技术上讲,您不需要“等待”。因此,之后需要执行的代码只能驻留在回调中。

关于javascript - 如何等到循环内的异步进程完成后再退出循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39648984/

相关文章:

php - 当返回序列化对象时,Redis 会剪切字符串。找不到任何限制

javascript - JS 字符串转处理值

javascript - 为什么这是指外部变量?

javascript - 3维数组排序Javascript

javascript - 以编程方式关闭 Vorpal 实例

javascript - -c 标志在 NodeJS 中起什么作用?

node.js - 以编程方式取消 MongoDB 事务

javascript - 将二进制数据从 Nodejs 缓冲区写入 Meteor 客户端上的 blob

node.js - 无法将 Angular 应用程序部署到openshift: “Argument error, options.body.”

node.js - 如何在 Mongoose 中查找文档时剪切文本?