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

我正在使用蓝鸟来提供mongoose库。 所以,我现在find并保存数据如下:

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

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

你实际上可以返回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返回一个承诺。 这个承诺然后通过外链,包括一个可能的错误。 在外链上,你可以用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' }); });