如何等待来自 forEach 循环的多个异步调用?
How to wait for multiple asynchronous calls from forEach loop?
正在尝试调用多个异步函数,因此得到的结果为 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 循环中的异步函数。
这里有几个选项:
递归调用 mongoDB - 将此查询包装在一个函数中,该函数在查询 returns.
之后调用自身
了解 mongoDB 批量操作 - https://docs.mongodb.com/manual/reference/method/Bulk/
通过将异步瀑布中的回调函数声明为 'async',然后在函数内部为每个函数使用 'await',在每次调用中使用 async/await 模式询问。开箱即用,forEach 不是异步的。如果你仍然想使用 forEach,你可以将它重写为异步(见下文)或使用常规的 for 循环:
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}
** 除了此处发布的内容之外,还有其他方法可以解决此问题,但如果正确实施,这里有一些方法会起作用。
我建议您立即添加对 callback(null,'done');
的调用 pendingData.push(total);
你是对的,异步的本质让你现在很为难,但假设你使用 Promises 并将它们链接在一起,那会为你省去很多麻烦。
有一次我遇到了类似的异步代码问题 运行 我想要的乱序所以我使用自定义 promise 函数做了一些调整(我弄好了)并将其称为 order..such Idea如果你能正确地将它应用到你的代码中,就可以解决你的问题
https://github.com/lalosh/Ideas/blob/master/promiseOrder.js
正在尝试调用多个异步函数,因此得到的结果为 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 循环中的异步函数。
这里有几个选项:
递归调用 mongoDB - 将此查询包装在一个函数中,该函数在查询 returns.
之后调用自身
了解 mongoDB 批量操作 - https://docs.mongodb.com/manual/reference/method/Bulk/
通过将异步瀑布中的回调函数声明为 'async',然后在函数内部为每个函数使用 'await',在每次调用中使用 async/await 模式询问。开箱即用,forEach 不是异步的。如果你仍然想使用 forEach,你可以将它重写为异步(见下文)或使用常规的 for 循环:
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}
** 除了此处发布的内容之外,还有其他方法可以解决此问题,但如果正确实施,这里有一些方法会起作用。
我建议您立即添加对 callback(null,'done');
的调用 pendingData.push(total);
你是对的,异步的本质让你现在很为难,但假设你使用 Promises 并将它们链接在一起,那会为你省去很多麻烦。
有一次我遇到了类似的异步代码问题 运行 我想要的乱序所以我使用自定义 promise 函数做了一些调整(我弄好了)并将其称为 order..such Idea如果你能正确地将它应用到你的代码中,就可以解决你的问题 https://github.com/lalosh/Ideas/blob/master/promiseOrder.js