javascript - 如何等待来自 forEach 循环的多个异步调用?
问题描述
尝试调用多个异步函数,因此得到的结果为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.
}
});
如何等待异步函数?
解决方案
我建议您callback(null,'done');
立即添加调用pendingData.push(total);
你是对的,异步特性现在让你很难过,但是假设你使用 Promises 并将它们链接在一起,那会为你省去很多麻烦。
有一次,我遇到了类似的异步代码乱序问题,所以我使用自定义的 promise 函数(我猜到了)做了一点调整,并称之为 order..如果你可以应用它,这样的想法可以解决你的问题正确地添加到您的代码 https://github.com/lalosh/Ideas/blob/master/promiseOrder.js
推荐阅读
- mongodb - Mongodb文本搜索(精确匹配、模糊匹配)
- javascript - 同步 iframe
- r - 如何在R中的同一图中将线图和箱线图与显着差异结合起来
- javascript - 带有 Express Swagger 生成器的自定义标头?
- git - 错误:GH008:您的推送引用了至少 4 个未知的 Git LFS 对象
- object-detection - 如何理解 yolov4 训练是否过拟合?
- twitter-bootstrap - 如何在 scss 中启用引导 rtl
- node.js - 请求失败,状态码 403,访问被拒绝:令牌无效,代码错误
- java - 如何在 sql 查询中传递参数而不使其在查询本身中显式?
- php - UNIX LF 到 Windows CR LF