javascript - foreach中的异步/等待不等待
问题描述
我正在尝试在使用循环的函数中使用async
和。恼人的是我无法让它工作。应该发生的是它需要一个 event 数组,遍历它们,添加一些额外的数据,然后将它们推送到数组中。然后从原始函数返回这个数组。这是我的代码:await
forEach
docs
events
events
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
我该如何解决?
解决方案
基本上,这就是内部发生的事情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;
}
推荐阅读
- forms - 当 webapp 被 doGet 触发时,不显示日志
- r - 如何在r中使用if语句和str_replace将一个单词替换为另一个单词
- python - python二十一点王牌问题,它破坏了我的代码
- arrays - 在 linux 中使用 curl 命令以 json 数组格式发布数据
- sql-server - 从一台服务器到另一台服务器启动作业并使其独立于第一台服务器运行
- concatenation - 如何连接包含多行数据的 2 列
- erp - 如何在 Moqui 中扩展组件屏幕?
- openlayers - OpenLayers 按百分比增加或减少范围
- java - JComponent.repaint() 没有响应
- flutter - 如何在 Flutter 中为文本字段自动显示键盘