簡體   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