繁体   English   中英

Angular Promise-分别链接拒绝和解决渠道

[英]Angular promises - Chaining reject and resolve channels separately

情况

如果我这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM