2 回答
TA贡献1836条经验 获得超3个赞
一般情况下,单块内,你应该要么使用await,或使用.then,但不能两者都-同样,使用Promise.prototype.catch是非常奇怪的结合try/catch,你已经可以await。
让你exports.query在第二个findOne完成后解决,await或者返回两个Promise ,并将内部findOne连接到外部 Promise 链。考虑这样的事情:
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 块将永远不会做任何有用的事情,因为任何问题都会触发该.catch方法,并且因为 Promise 没有被await编辑。最好不要混合这两种风格 - 要么选择await和try/catch或.then和.catch,但不能同时使用,否则控制流可能变得难以理解。
TA贡献1829条经验 获得超6个赞
首先, async-await 可以用在返回承诺的函数中。为什么我们必须使用await而不是then. await通过使执行感觉像同步来异步处理代码。
在您的第一个示例中,一切正常。但是在第二个中,您需要等待 findOne 查询。这里的 FineOne 将异步工作
exports.query = async(req, res) => {
try{
user.findOne({})
.then(async(result) =>{
let orderResult = await order.findOne({id: result.id})
.catch(e => res.send(e)
} catch(error) {
res.send(error)
}
}
可以再次简化为
exports.query = async(req, res) => {
try{
let result = await user.findOne({});
let orderResult = order.findOne({id: result.id});
} catch(error) {
res.send(error)
}
}
添加回答
举报