如何在nodejs中使用异步等待
我制作了如下所示的api。我认为它无疑运行得很好。
exports.query = async(req, res) => {
try{
const result = await user.findOne({})
res.send(result);
} catch(error) {
res.send(error)
}
}
但是当我像下面这样尝试时,我不确定它是否异步运行。
exports.query = async(req, res) => {
try{
user.findOne({})
.then(async(result) =>{
order.findOne({id: result.id})
.catch(e => res.send(e)
} catch(error) {
res.send(error)
}
}
我必须像下面那样在user.findOne({})前面附加'await'吗?
exports.query = async(req, res) => {
try{
await user.findOne({})
.then(async(result) =>{
还是没关系?也就是说,即使我不使用'then'在前面将await写到user.findOne上,它的工作方式也一样非常规。
非常感谢您阅读。
回答如下:通常,在一个块中,您应该任一使用await
,或使用.then
,但不能两者都使用-类似地,组合使用Promise.prototype.catch
是真的很奇怪使用try/catch
,您已经可以使用await
。
为了让exports.query
在第二个findOne
完成后解决,await
或返回两个承诺,和将连接到外部Promise链的内部findOne
连接起来。考虑这样的事情:
exports.query = async (req, res) => {
try {
const userResult = await user.findOne({});
const orderResult = await userResult.findOne({ id: userResult.id });
// do something with orderResult
} catch (error) {
res.send(error)
}
}
如果您不使用.then
而使用catch
和await
,那么它将看起来像:
exports.query = (req, res) => {
return user.findOne({})
.then((result) => {
return order.findOne({
id: result.id
})
.then((orderResult) => {
// do something with orderResult
})
.catch(e => res.send(e))
});
}
使用第二个代码段中的代码,您的try
/catch
block将永远不会做任何有用的事情,因为任何问题都会触发.catch
方法,并且Promise不会被await
处理。最好不要混合使用两种样式-选择await
和try
/ catch
或.then
和.catch
,但不要两者都选,否则控制流程可能会变得难以理解。