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 中,您没有 awaituser.save()res.send(user) 的结果。应该这样做吗? @MattCleary 我没有,因为问题中的代码也没有。但是,是的,我很确定您应该 await user.save()send 不返回承诺 afaik 所以没有什么可等待的。【参考方案2】:

简答NO,async/await 只是您使用then / catch 编写的代码的语法糖。

唯一的好处是您眼中的秩序。不需要回调,你模仿“同步”代码风格。

【讨论】:

以上是关于Promises => Async/Await....这有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Promises 进行异步无限循环

fs.promises.readFile ENOENT 错误中没有堆栈

我可以用 bluebird Promises 提前打破链条吗?

使用 Promises 处理 Mongoose 错误

Node.js assert.throws 带有异步函数(Promises)

关于链接es6 Promises,然后()和价值消费