情況
如果我這樣做:角的承諾 - 鏈接拒絕和解決渠道分別
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()'不會被調用。 – thedarklord47
只是雙重檢查,'角承諾'承諾/ A +兼容,所以你原來的「情況」應該工作正常。我想你應該仔細檢查'cookFood()'以確保它實際上正在解決。 – thedarklord47
@ thedarklord47是的,以前的承諾並沒有真正的拒絕,因此我的困惑。另外,從https://github.com/kriskowal/q(在我的評論中提到接受的答案中提到)解釋了錯誤的方式。 – JoelSanchez