gpt4 book ai didi

javascript - 如何等待来自 forEach 循环的多个异步调用?

转载 作者:行者123 更新时间:2023-11-30 09:20:03 27 4
gpt4 key购买 nike

尝试调用多个异步函数,结果为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.
}
});

如何等待异步函数?

最佳答案

您遇到的问题是您是非异步 forEach 循环中的异步函数。

这里有几个选项:

  1. 递归调用 mongoDB - 将此查询包装在一个函数中,该函数在查询返回后调用自身。

  2. 阅读有关 mongoDB 批处理操作的信息 - https://docs.mongodb.com/manual/reference/method/Bulk/

  3. 通过将异步 waterfall 中的回调函数声明为“async”,然后在每个查询的函数内部使用“await”,在每次调用中使用异步/等待模式。开箱即用,forEach 不是异步的。如果您仍想使用 forEach,您可以将其重新编写为异步(见下文)或使用常规 for 循环:

async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}

** 除了此处发布的内容之外,还有其他方法可以解决此问题,但如果正确实现,这里有一些方法会起作用。

关于javascript - 如何等待来自 forEach 循环的多个异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52319710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com