尽管我已将值推入foreach内的同一数组,但返回的是空数组

时间:2020-08-19 15:44:34

标签: javascript node.js

我在下面添加了我的代码。 Console.log()打印一个空数组。谁能告诉我原因?

var arr = [];
stages.forEach(async(stage) => {
  const tasks = await Task.find({
    stageName: stage._id
  });
  return arr.push(tasks);  
});
console.log(arr);

4 个答案:

答案 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)或任务完成后