Joe*_*hez 1 javascript promise angularjs angular-promise
如果我这样做:
cookFood().then(function(food) {
eatFood(food);
});
Run Code Online (Sandbox Code Playgroud)
无论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...');
}
});
Run Code Online (Sandbox Code Playgroud)
我永远不会得到警报,因为我之前执行过错误处理程序.我不希望这样,因为我想要执行这两个.此外,如果出现错误,将调用"shitFood",这是不受欢迎的.
我知道两种情况的解决方案.我只是觉得"必须有更好的方法".
到第一个:
cookFood().then(function(food) {
eatFood(food);
}, angular.noop);
Run Code Online (Sandbox Code Playgroud)
现在吃的食物不会被称为不是食物的东西.但是每次我都不想使用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...');
}
});
Run Code Online (Sandbox Code Playgroud)
这可以按照我的预期工作,但我认为我不需要手动拒绝,因为值处理程序不必手动解析.
大多数情况下,我想清除我可能存在的任何误解,并了解更好的方法.谢谢.
如果我这样做
cookFood().then(eatFood);,无论cookFood拒绝还是解决,eatFood都将被执行.
不,那是不真实的.eatFood将只被执行时cookFood履行.您不必通过noop或null作为拒绝处理程序来获取该行为.
Run Code Online (Sandbox Code Playgroud)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(…);
Run Code Online (Sandbox Code Playgroud)