【问题标题】:Javascript async function flowJavascript异步函数流程
【发布时间】:2019-06-13 17:49:46
【问题描述】:

如果有空位,我的职能部门应分配一名员工。我不明白为什么即使我使用了“等待”,程序也不能同步。

在函数的第一行,程序按预期运行。它等待从数据库中获取“席位”,然后执行“if(seats.length > 0)” 检查并初始化一个空数组。

async function AssignSeat(req, res) {

  var seats = await connection.SeatEmployees.findAll({
    where: {
      SeatId: req.body.seat.SeatId
    }
  })
  .catch(err => {
    res.status(err.status).json(err)
  });


  if(seats.length > 0){
    var isShared = true;

    var employees = [];

    await seats.forEach(async function(seat){
      var employee = await connection.EmployeesGraph.findAll({
        where: {
          id: seat.EmployeeGraphId
        }
      })
      .catch(err => {
        res.status(err.status).json(err)
      });

      employees.push(employee);
    })
    .catch(err => {
      res.status(err.status).json(err)
    });


    employees.forEach(employee => {
      if(employee.frequent == true)
          isShared = false;
    })


    if(isShared == true){
      //assign user to seat;
    }
  }
}

我的问题出在代码的第 13 行,在“await seat.forEach(async function(seat)”处。

我要做的是遍历“席位”的每个元素,获取分配到该席位的员工,并将其推入“员工”数组。

只有在遍历所有席位并填充员工数组后,我才想继续执行“employees.forEach(employee => {”行。

相反,调用之后会发生什么
-----"var employee = await connection.EmployeesGraph.findAll({ "---- ,程序不等待sequelize从数据库中获取员工然后去----"employees.push (employee);"---- ,如预期的那样。
它转到 ----"employees.push(employee);"---- 之后的行括号,然后我收到错误 "TypeError: Cannot read property 'catch' of undefined"。

您能解释一下为什么会这样吗?

【问题讨论】:

  • 使用实际的 for 循环代替。 forEach 不会等待迭代。
  • 您能否按原样查看您的问题,然后点击“编辑”以正确格式化?您的代码缩进不正确,甚至没有标记为代码,等等。

标签: javascript function asynchronous sequelize.js


【解决方案1】:

最简单的解决方案是为此任务使用实际的 for 循环而不是 forEachforEach() 不会等待迭代所有内容。

try {
  for (const seat of seats) {
    var employee = await connection.EmployeesGraph.findAll({
        where: {
          id: seat.EmployeeGraphId
        }
      })
      .catch(err => {
        res.status(err.status).json(err)
      });

    employees.push(employee);
  }
} catch (err) {
  res.status(err.status).json(err)
}

【讨论】:

  • 但是如果你确实需要异步foreach,你可以使用await Promise.all(list.map(thing => new Promise(resolve => { ...; ...; resolve(); }))
  • @Mike'Pomax'Kamermans 他们将同时运行。这将等待每个完成,然后再开始下一个。
  • 当然可以,但从他们的代码来看,他们不需要 forEach,只需要一个“for all”。
猜你喜欢
  • 2017-08-01
  • 2015-12-19
  • 2022-01-03
  • 2018-09-19
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2012-02-25
  • 2014-10-28
相关资源
最近更新 更多