Поток асинхронной функции Javascript - PullRequest
0 голосов
/ 13 июня 2019

Моя функция должна назначать сотрудника на место, если место доступно. Я не понимаю, почему программа не работает синхронно, хотя я использовал «ожидание».

В первых строках функции программа работает как положено. он ожидает получения «мест» из базы данных, затем выполняет «если (мест. длина> 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 (асинхронная функция (seat))".

То, что я хочу сделать, - это просмотреть каждый элемент «мест», получить сотрудника, назначенного на это место, и вставить его в массив «сотрудников».

Только после итерации со всех мест и заполнения массива сотрудников я хочу перейти к строке "employee.forEach (employee => {".

Вместо этого происходит то, что после вызова
----- "var employee = await connection.EmployeesGraph.findAll ({" ----, программа не ожидает продолжения, чтобы получить сотрудника из базы данных, а затем перейти к ---- "employee.push (сотрудник); "----, как и предполагалось.
После ---- "employee.push (employee);" ---- переходит к пункту в строке, затем я получаю сообщение об ошибке "Ошибка типа: невозможно прочитать свойство 'catch' of undefined".

Не могли бы вы объяснить, почему это происходит?

1 Ответ

1 голос
/ 13 июня 2019

Самое простое решение - использовать для этой задачи фактический цикл вместо forEach. forEach() не будет ждать, чтобы перебрать все.

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...