角度承诺 - 链接分别拒绝和解决渠道

时间:2016-11-22 22:47:36

标签: javascript angularjs promise angular-promise

情况

如果我这样做:

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

现在吃的食物不会被称为不是食物的东西。但是,每次我都不想使用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...');
   }
});

这符合我的预期,但我认为我不需要手动拒绝,因为值处理程序不必手动解析。

大多数情况下,我希望清除我可能存在的任何误解,并了解更好的方法。谢谢。

1 个答案:

答案 0 :(得分:5)

  

如果我做cookFood().then(eatFood);,无论cookFood拒绝还是拒绝,eatFood都将被执行。

不,那是不真实的。当eatFood完成时,cookFood将仅执行 。您不必通过noopnull或其他内容作为拒绝处理程序来获取该行为。

cookFood().then(function(food) {
    return eatFood(food);
}, function() {
    console.error('Error coooking food');
    return $q.reject('FOOD_ERROR');
}).then(…);
     

这符合我的预期,但我认为我不需要手动操作   拒绝,因为值处理程序不必手动解析。

是的,如果您想要发出结果信号,您总是需要手动return一个值。这是否是一个普通的价值,一个将履行的承诺或被拒绝的承诺取决于所期望的行为。

但是你不必返回被拒绝的承诺,你也可以抛出异常:

cookFood().then(eatFood, function() {
    console.error('Error coooking food');
    throw new Error('FOOD_ERROR');
}).then(…);