【发布时间】:2016-11-23 07:24:22
【问题描述】:
情况
如果我这样做:
cookFood().then(function(food) {
eatFood(food);
});
无论 cookFood 拒绝还是解析,eatFood 都会被执行。我不希望这样,因为我希望它仅在它解决时执行,因为这就是它的目的,而不是用于处理错误。 另外,如果我这样做:
cookFood().then(function(food) {
return eatFood(food);
}, function() {
console.error('Error coooking food');
return 'FOOD_ERROR';
}).then(function(food) {
return shitFood(food);
}, function(err) {
if (err === 'FOOD_ERROR') {
alert('Looks like there was an error cooking food...');
}
});
我永远不会收到警报,因为我之前执行过错误处理程序。我不想要那个,因为我想同时执行。此外,如果出现错误,将调用“shitFood”,这是不受欢迎的。
解决方案
我知道这两种情况的解决方案。我只是认为“必须有更好的方法”。
到第一个:
cookFood().then(function(food) {
eatFood(food);
}, angular.noop);
现在,eatFood 不会被调用为不是食物的东西。但是,每次我不想处理错误时,我是否必须使用 angular.noop(因为我将在链的后面这样做)?
到第二个:
cookFood().then(function(food) {
return eatFood(food);
}, function() {
console.error('Error coooking food');
return $q.reject('FOOD_ERROR');
}).then(function(food) {
return shitFood(food);
}, function(err) {
if (err === 'FOOD_ERROR') {
alert('Looks like there was an error cooking food...');
}
});
这符合我的预期,但我认为我不需要手动拒绝,因为值处理程序不必手动解析。
我主要想澄清我可能有的任何误解,并了解更好的方法来做到这一点。谢谢。
【问题讨论】:
-
很确定如果
cookFood()拒绝,eatFood()将不会被调用。 -
仔细检查,
angular-promises符合 Promises/A+,因此您原来的“情况”应该可以正常工作。我认为您应该仔细检查cookFood()以确保它确实在解决。 -
@thedarklord47 是的,之前的承诺实际上并没有拒绝,因此我很困惑。另外,理解错误的方式来自github.com/kriskowal/q 的解释(在我对已接受答案的评论中提到)。
标签: javascript angularjs promise angular-promise