首页 > 解决方案 > foreach中的异步/等待不等待

问题描述

我正在尝试在使用循环的函数中使用async和。恼人的是我无法让它工作。应该发生的是它需要一个 event 数组,遍历它们,添加一些额外的数据,然后将它们推送到数组中。然后从原始函数返回这个数组。这是我的代码:awaitforEachdocseventsevents

async function getEvents() {
  ...
  var events = []
  await addExtrasToDocsForUser(docs, currentUserId, events)
  return events

}


var addExtrasToDocsForUser = (docs, currentUserId, events) => {
    return docs.forEach(async (eventDoc) => {
        const event = await addExtrasToDocForUser(eventDoc, currentUserId)
        events.push(event)
    })
}

实际发生的是getEvents()函数在循环完成events之前返回一个空数组。forEach我该如何解决?

标签: javascriptasync-await

解决方案


基本上,这就是内部发生的事情forEach

Array.prototype.forEach = function (callback) {
  for (let index = 0; index < this.length; index++) {
    callback(this[index], index, this);
  }
};

实际上,真正的实现如下,但底线是我们不是在等待回调完成,所以使用返回一个承诺的函数不会每次都等待承诺解决。

您的代码不完整且无法验证,因此我无法确定以下内容是否有效,但它可能应该按照您的预期运行:

const addExtrasToDocsForUser = async (docs, currentUserId, events) => {
  for (let i=0; i<docs.length; i++) {
    const event = await addExtrasToDocForUser(docs[i], currentUserId);
    events.push(event);
  }
  return;
}

您可能还想查看有关 foreach + async/await 的 CodeBurst 文章


推荐阅读