Promises =>异步/等待......这有什么好处吗?

时间:2017-08-28 18:35:44

标签: javascript node.js promise async-await

我正在使用我的快速服务器控制器并从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);
  },

如果重构没有提高可读性,我不应该打扰吗?

谢谢!

2 个答案:

答案 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编写的代码的语法糖。

唯一的好处就是命令在你眼前。没有必要回调,你模仿"同步"代码风格。