首页 > 解决方案 > 如何等待来自 forEach 循环的多个异步调用?

问题描述

尝试调用多个异步函数,因此得到的结果为undefined.

尝试过async.waterfall,但无法使其工作。

代码:

const pendingData = [];

async.waterfall([
    function (callback) {
      WaitForApproval.find({}, (err,result) => {
        callback(null,result);
      });
    },
    function (result, callback) {
      result.forEach(data => {
        User.findOne({_id: data.uploadedBy}, (err,name) => {
          let total = {
            id: data._id,
            name: name.name,
            subject: data.subject,
            uploadOn: data.uploadedAt
          };
          pendingData.push(total);
        });
      });
      callback(null,'done');
    }
  ], function (err,result) {
    if(result === 'done') {   
      console.log(pendingData); // it is giving empty result.
    }
  });

如何等待异步函数?

标签: javascriptnode.jsecmascript-6ecmascript-5ecmascript-2017

解决方案


我建议您callback(null,'done');立即添加调用pendingData.push(total);

你是对的,异步特性现在让你很难过,但是假设你使用 Promises 并将它们链接在一起,那会为你省去很多麻烦。

有一次,我遇到了类似的异步代码乱序问题,所以我使用自定义的 promise 函数(我猜到了)做了一点调整,并称之为 order..如果你可以应用它,这样的想法可以解决你的问题正确地添加到您的代码 https://github.com/lalosh/Ideas/blob/master/promiseOrder.js


推荐阅读