【问题标题】:Angular promises - Chaining reject and resolve channels separatelyAngular promises - 分别链接拒绝和解析通道
【发布时间】: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


【解决方案1】:

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

不,那是不真实的。 eatFoodcookFood 完成时执行。您不必传递 noopnull 或其他东西作为拒绝处理程序来获得该行为。

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

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

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

但是你不必返回一个被拒绝的promise,你也可以只抛出一个异常:

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

【讨论】:

  • "如果我做 cookFood().then(eatFood);,无论是 cookFood 拒绝还是解决,eatFood 都会被执行。看起来我正在经历这种情况,因为在链的上一步中没有返回被拒绝的承诺,并且错误地认为这是因为这句话所指的是:“如果 getInputPromise() 承诺被拒绝并且你省略了拒绝处理程序,错误将转到 outputPromise:" (from github.com/kriskowal/q ) 知道了。接受:)
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多