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'
});
});
这太棒了!感谢您的解释。您忘记了
返回处理程序发出的内部承诺