我正在使用我的快速服务器控制器并从promises
重构为async/await
。对于某些功能,我不确定我是否只是为了它而做。如果它不再具有可读性,我还应该这样做吗?
以下是一个例子:
async sharedTroop(req, res, next) {
const firebaseUID = req.params.uid;
try {
const user = await User.findOne({ firebaseUID }).select('troopPointTotal');
user.troopPointTotal += 1000;
try {
user.save();
try {
res.send(user);
} catch (e) {
next(e);
}
} catch (e) {
next(e);
}
} catch (e) {
next(e);
}
}
以上(使用async/await
)是否有任何好处?:
sharedTroop(req, res, next) {
const firebaseUID = req.params.uid;
User.findOne({ firebaseUID })
.select('troopPointTotal')
.then(user => {
user.troopPointTotal += 1000;
user.save().then(() => res.send(user));
})
.catch(next);
},
如果重构没有提高可读性,我不应该打扰吗?
谢谢!
答案 0 :(得分:3)
没有理由嵌套try
语句:
async sharedTroop(req, res, next) {
const firebaseUID = req.params.uid;
try {
const user = await User.findOne({ firebaseUID }).select('troopPointTotal');
user.troopPointTotal += 1000;
user.save();
res.send(user);
} catch(e) {
next(e);
}
}
这可能看起来比then
解决方案的嵌套回调更好。它还简化了您的错误修复:在发送响应之前,您需要await
user.save()
的结果 - 然后catch
将隐式处理保存过程中的错误。相比之下,您的then
版本也存在类似错误:通过回调return
user.save().then(() => res.send(user))
的结果,最终.catch()
无法处理错误
如果重构没有提高可读性,我不应该打扰吗?
当然,可读性是主观的,如果你认为没有优势那么你就不应该去反应堆。
答案 1 :(得分:2)
简短回答NO,async/await
只是您用then / catch
编写的代码的语法糖。
唯一的好处就是命令在你眼前。没有必要回调,你模仿"同步"代码风格。