Promises => Async/Await....这有啥好处吗?
Posted
技术标签:
【中文标题】Promises => Async/Await....这有啥好处吗?【英文标题】:Promises => Async/Await....Does this have any benefits?Promises => Async/Await....这有什么好处吗? 【发布时间】:2018-02-06 02:22:24 【问题描述】:我正在处理我的快速服务器控制器并将 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);
,
如果重构没有提高可读性,我应该不打扰吗?
谢谢!
【问题讨论】:
@downvoters:请发表评论 有些人无法处理非命令式的编码风格 - async/await 允许更命令式的风格 - 但这是意见 【参考方案1】:没有理由嵌套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
解决方案的嵌套回调要好得多。它还简化了纠正错误的过程:您需要在发送响应之前将user.save()
的结果发送给await
- 然后catch
将隐式处理保存过程中的错误。相比之下,你的then
版本有一个类似的错误:如果不是return
从回调中得到user.save().then(() => res.send(user))
的结果,错误最终不会被.catch()
处理。
如果重构没有提高可读性,我应该不打扰吗?
当然,可读性是主观的,如果你认为没有优势,那么你不应该费心去反应。
【讨论】:
谢谢!我注意到在您上面的代码 sn-p 中,您没有await
是 user.save()
或 res.send(user)
的结果。应该这样做吗?
@MattCleary 我没有,因为问题中的代码也没有。但是,是的,我很确定您应该 await user.save()
。 send
不返回承诺 afaik 所以没有什么可等待的。【参考方案2】:
简答NO,async/await
只是您使用then / catch
编写的代码的语法糖。
唯一的好处是您眼中的秩序。不需要回调,你模仿“同步”代码风格。
【讨论】:
以上是关于Promises => Async/Await....这有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章
fs.promises.readFile ENOENT 错误中没有堆栈
我可以用 bluebird Promises 提前打破链条吗?