完成forEach循环(异步)后返回数组

时间:2017-11-10 10:53:32

标签: javascript asynchronous es6-promise

我现在已经在这几个小时里苦苦挣扎了。我正在尝试从我的数据库中收集数据并将其推送到数组。循环完成后,我想返回包含检索数据的数组。现在我设法创建一个async forEach循环,但是(正如预期的那样)我收到一个空数组,因为它不会等待函数结束。

这是我的代码:

StatusHandler.prototype.recover = async function recover(modelIds) {
  try {
    const items = [];
    modelIds.forEach(async (id) => {
      try {
        const query = {
          [this.modelId]: ObjectId(id),
          deleted: 'Y',
          xms_status: {
            $nin: [/inactive/, /maintenance/],
          },
        };
        const model = await this.Model.findOne(query);
        console.log(model); // Shows the correct data.
        items.push(model);
      } catch (err) {
        throw err;
      }
    }, this);
    return items; // Returns empty array
  } catch (err) {
    throw err;
  }
};

我看到了一些相关问题,并注意到我可以使用for..of循环,但我无法使用它,因为Airbnb JavaScript样式指南(它建议使用forEach代替{{1} }})。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不明白你为什么要遍历一系列ID并使用findOne来检索你的对象,你可以使用这样的东西:

await this.Model.find({_id: {$in: modelIds}});

此外,为什么不使用forEach而不是使用map来推送数组?

我认为你可以这样做:

async function recover(modelIds) {
  return modelsIds.map(async (modelId, i) => {
    const query = "..."; // your query with the id
    return await this.Model.findOne(query);
  })
}

你的函数用try/catch调用的环绕声来捕捉函数执行过程中出现的错误。