javascript - Javascript异步函数流程
问题描述
如果有空位,我的职能部门应该分配一名员工。我不明白为什么即使我使用了“等待”程序也不能同步。
在函数的第一行中,程序按预期运行。它等待从数据库中获取“席位”,然后执行“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:无法读取未定义的属性'catch'”。
你能解释一下为什么会这样吗?
解决方案
最简单的解决方案是使用实际的 for 循环而不是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)
}
推荐阅读
- c++ - 如何在 x64 程序中获取堆栈调用信息?
- c++ - socket关闭后控制流程如何?
- javascript - Quick access to deeply nested values in Objects in Javascript
- c++ - 在地图中增加元组
- android - 在 MediaStore.Audio.Media,DATA 被弃用后,在 Android 11 中获取歌曲的专辑封面
- python - 编写一个循环代码来计算平均 77 次不同的时间,使用另一列作为标准
- asp.net - C# 使用 ID 节点反序列化 Json
- kubernetes - 网络中断期间对 Redhat Openshift 工作负载的影响
- python - 如何使用正确采样率的 pretty_midi 将 midi 文件更改为钢琴卷?
- java - Java中块的排序日期列表