【发布时间】:2018-08-07 18:36:08
【问题描述】:
我有一段代码在其中运行 2 个 promise。
问题是第二个 promise 运行时第一个 promise 仍在运行。这给我带来了很多问题。 我希望第二个承诺不会运行,直到我从第一个承诺中得到答案。
我不想将第二个承诺放在第一个承诺中。
有人知道我怎么能做到这一点?是否可以使用异步等待?
这是我的代码:
router.post("/", (req, res) => {
if (!checkIfOrderValid(req.body)) {
return res.sendStatus(400);
}
let order = new Order(req.body);
order._UserId = '5b58836ed741e92d7416002e';
//first check if the seats are taken
/*
this is working. but gives me
"(node:14552) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): Error: Can't set
headers after they are sent."
when the seats are taken. check it out
*/
Show.findById(req.body._ShowId).then(show => {
req.body.ticketsPositions.forEach(element => {
console.log('checking: ' + element[0] + "-" + element[1]);
if (show.showTakenSeats.hasOwnProperty(element[0] + "-" + element[1])){
console.log('seat are already taken!');
return res.status(400).json({'message': 'Seats are already taken!'})
}
});
});
order.save().then(newOrder => {
console.log("Order saved successfully");
res.json(newOrder);
}, err => {
res.send(err);
});
});
非常感谢!
【问题讨论】:
-
另外说明:在
.forEach()中返回 res.status(...).json(...)` 是个问题。它不会停止您的.forEach()循环,您可能会尝试发送多个响应,因此部分设计有点混乱。 -
您可以通过链接 promise(无需嵌套)或使用 async/await 来实现您的目标。如果您想进行一些研究,则有数千篇关于这两个方面的文章。
标签: javascript node.js ecmascript-6 async-await es6-promise