在承诺中传播.catch的正确方法是什么?

lva*_*yut 4 javascript node.js promise bluebird

我正在使用蓝鸟来宣传猫鼬图书馆.所以,我目前找到并保存数据如下:

    User.findOneAsync({email: req.body.text})
      .then(function(user) {
        user.saveAsync()
          .spread(function(savedUser){
            res.json(savedUser);
          })
          .catch(function(err) {
            res.json({
              status: 500,
              message: 'foo'
            });
          });
      })
      .catch(function(err) {
         res.json({
           status: 500,
           message: 'foo'
         });
      });
Run Code Online (Sandbox Code Playgroud)

两个捕获功能完全相同.这只是一个演示,我有时在实际工作中有两个相同的捕获功能.我可以将catch中的函数分成它自己的函数.但是,无论如何,我必须多次编写catch函数.避免重复捕获功能的好方法是什么?任何帮助,将不胜感激.

Lor*_*enz 5

你实际上可以回来user.saveAsync().然后您的错误传播到较低的catch函数.像那样:

 User.findOneAsync({email: req.body.text})
  .then(function(user) {
    return user.saveAsync()
      .spread(function(savedUser){
        res.json(savedUser);
      });
  })
  .catch(function(err) {
     res.json({
       status: 500,
       message: 'foo'
     });
  });
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为你spread返回一个Promise.然后,这个承诺将沿着外链传递,包括可能的错误.在外链中,您可以使用您的catch函数捕获它,现在它将从内链和外链捕获错误,因为它们已连接.

您还可以通过以下方式执行某些操作来缩短此代码并且没有两个承诺链:

 User.findOneAsync({email: req.body.text})
 .call("saveAsync")
 .spread(function (savedUser) {
     res.json(savedUser);
 })
 .catch(function(err) {
    res.json({
      status: 500,
      message: 'foo'
    });
 });
Run Code Online (Sandbox Code Playgroud)

在使用promises时,这通常被认为是一种很好的做法.