使用快递路线处理程序和承诺 - 最佳做法是什么?

时间:2017-10-01 07:52:32

标签: javascript node.js express promise

我目前正在开发一个Web项目,我正在尝试理解Node.js并表达。我知道为了实现异步易于维护的代码我们应该使用promises,但我对以下场景感到困惑: 我有REST API的路由处理程序,我应该返回一个promise吗?即使那里没有完成异步工作? 即:

dummy_router.post("/", passport.authenticationMiddleware(), (req, res) => {
  return new Promise((fulfill, reject) => {
      var result = some_simple_functionality();
      if (result) {
          fulfill(result)
      } else {
          reject(err)
      }

  }).catch(function (error) {
      res.status(400).send('400: failed t :: ' + error + '\n');
  });
});

同样问题上的第二个问题。如果我正在执行一些异步任务并承诺包含它们,那么这是一个好习惯吗?

dummy_router.post("/", passport.authenticationMiddleware(), (req, res) => {
  some_promise().then((result) => {

  }, (err) => {

  }).catch(function (error) {
    res.status(400).send('400: failed t :: ' + error + '\n');
  });
});

1 个答案:

答案 0 :(得分:0)

将我的评论转化为答案:

你的第一个例子是在不需要时制造承诺。没有理由在promise中包含同步代码。这只会增加不需要的复杂性并且不会带来任何好处。 Express不会对请求处理程序的返回值执行任何操作,因此根本不返回承诺。

您的第二个示例似乎是使用返回promise的实际异步操作。这看起来大致正确,但不清楚为什么你的.then()和.catch()都有错误处理程序。选择一个或另一个,并注意拒绝处理程序不会重新抛出或返回被拒绝的承诺会将承诺更改为已履行的承诺(覆盖拒绝)。

所以,当你这样做时:

  some_promise().then((result) => {

  }, (err) => {
      // unless you rethrow here, this will "handle" the error
      // and the promise will become fulfilled, not rejected
  }).catch(function (error) {
      res.status(400).send('400: failed t :: ' + error + '\n');
  });

(err) => {}处理程序导致您的承诺被拒绝被拒绝,除非您重新抛出或返回被拒绝的承诺。

所以,你可能想要的就是这个:

  some_promise().then((result) => {
      // code to process result here
      res.send(...);
  }).catch(function (error) {
      res.status(400).send('400: failed t :: ' + error + '\n');
  });

很少有理由同时使用.then()拒绝处理程序(.then()的第二个参数和后续的.catch()处理程序。

  

是否有理由同时使用拒绝处理程序和catch()?

没有。有一些不常见的情况,你可能想要两者,但在这种情况下(在大多数情况下),只需要.catch()处理程序。