我在下面添加了我的代码。 Console.log()打印一个空数组。谁能告诉我原因?
var arr = [];
stages.forEach(async(stage) => {
const tasks = await Task.find({
stageName: stage._id
});
return arr.push(tasks);
});
console.log(arr);
答案 0 :(得分:0)
您正在执行异步操作。当console.log
运行时,数组将不包含元素。每次对匿名函数的调用都会返回您忽略的承诺。如果要确保获得结果,可以执行以下操作:
let promises = stages.map(stage => Task.find({
stageName: stage._id
}));
Promise.all(promises)
.then(results => {
console.log(results);
});
答案 1 :(得分:0)
在这种情况下,在async/await
循环中使用forEach
对您没有帮助,而是使用常规的for
循环
async function execute() {
var arr = []
for (let stage of stages) {
const tasks = await Task.find({
stageName: stage._id,
})
return arr.push(tasks)
}
console.log(arr)
}
execute()
答案 2 :(得分:0)
循环遍历阶段不会在循环console.log打印之前异步运行
const promises = _.map(stages, async (stage) => {
const tasks = await Task.find({
stageName: stage._id
});
return tasks
})
const tasks = await Promise.all(promises)
lodash
异步映射返回承诺并提供解析数据
答案 3 :(得分:0)
如果我的猜测正确,
async(stage) => {
const tasks = await Task.find({
stageName: stage._id
});
return arr.push(tasks);
}
此代码将在下一个事件循环中执行。因此console.log()
立即执行,因此数组为[]
尝试记录setTimeout(() => console.log(arr), 1000)
或任务完成后