【问题标题】: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 允许更命令式的风格 - 但这是意见

标签: javascript node.js promise 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 编写的代码的语法糖。

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

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2020-04-12
    • 2016-06-02
    相关资源
    最近更新 更多