Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这是正确的传播方式。抓住承诺?_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 什么';这是正确的传播方式。抓住承诺?

Javascript 什么';这是正确的传播方式。抓住承诺?,javascript,node.js,promise,bluebird,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) {

我在用蓝鸟来宣传猫鼬图书馆。因此,我目前查找并保存数据如下:

    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函数。我可以将catch中的函数分离为它自己的函数。然而,无论如何,我必须多次编写catch函数。避免重复捕获函数的好方法是什么?任何帮助都将不胜感激

实际上,您只需返回
user.saveAsync()
。然后,错误会传播到lower 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'
     });
  });
这是因为您的
排列
返回承诺。然后,该承诺沿着外链传递,包括一个可能的错误。在外链中,您可以使用
catch
函数捕获该错误,该函数现在将捕获内链和外链中的错误,因为它们是连接的

您还可以通过以下方式缩短此代码,而不必拥有两条承诺链:

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

这通常被认为是处理承诺的良好实践。

除非需要,否则应避免嵌套在成功句柄中。它使您的代码更具可读性,您只需使用一个catch函数。所有被拒绝的承诺都会传播到最后一个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'
        });
    });

这太棒了!感谢您的解释。您忘记了
返回
处理程序发出的
内部承诺