2016-11-22 79 views
1

情况

如果我这样做:角的承诺 - 链接拒绝和解决渠道分别

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...'); 
    } 
}); 

这个工程,我希望,但我觉得我不应该需要手动拒绝,因为该值处理程序不必手动解决。

大多数情况下,我想澄清我可能存在的任何误解,并了解更好的方法来做到这一点。谢谢。

+1

敢肯定,如果'cookFood()'拒绝,'eatFood()'不会被调用。 – thedarklord47

+0

只是双重检查,'角承诺'承诺/ A +兼容,所以你原来的“情况”应该工作正常。我想你应该仔细检查'cookFood()'以确保它实际上正在解决。 – thedarklord47

+0

@ thedarklord47是的,以前的承诺并没有真正的拒绝,因此我的困惑。另外,从https://github.com/kriskowal/q(在我的评论中提到接受的答案中提到)解释了错误的方式。 – JoelSanchez

回答

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(…); 
+0

“如果我做了cookFood()。那么(eatFood);,不管cookFood拒绝还是解决,eatFood都会被执行。” 看起来我正在经历这种情况,因为没有在链中的上一步中返回被拒绝的承诺,并且错误地认为这是因为这个短语所指的是: “如果getInputPromise()承诺被拒绝,并且您省略拒绝处理程序,错误将转到outputPromise:“ (来自https://github.com/kriskowal/q) 明白了。接受:) – JoelSanchez