2016-11-22 120 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