情况
如果我这样做:角的承诺 - 链接拒绝和解决渠道分别
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()'不会被调用。 – thedarklord47
只是双重检查,'角承诺'承诺/ A +兼容,所以你原来的“情况”应该工作正常。我想你应该仔细检查'cookFood()'以确保它实际上正在解决。 – thedarklord47
@ thedarklord47是的,以前的承诺并没有真正的拒绝,因此我的困惑。另外,从https://github.com/kriskowal/q(在我的评论中提到接受的答案中提到)解释了错误的方式。 – JoelSanchez