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

时间:2015-11-27 16:24:15

标签: 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'
         });
      });

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

2 个答案:

答案 0 :(得分: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'
     });
  });

这是有效的,因为您的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'
    });
 });

在处理承诺时,这通常被认为是一种很好的做法。

答案 1 :(得分:3)

除非需要,否则应避免在然后成功句柄中嵌套。它使您的代码更具可读性,您只需使用一个catch函数。所有被拒绝的承诺都会传播到最后一个捕获函数。

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