2013-06-24 39 views
6

Mark Dalgleish編寫了一個nice little article關於如何在AngularJS視圖中使用promise。 有些人在評論中提出了關於這個問題的問題,但馬克沒有回答他們(還)。因爲我在問我同樣的問題,我會問在計算器上,而不是得到答案:如果您使用的意見,承諾在AngularJS視圖中使用Promise

  1. 我該如何處理「裝載」 /「等待」指示,因爲他們是異步?承諾是否具有「已​​解決」或「withinRequest」屬性?

  2. 如何處理錯誤?通常他們會在第二個回調中出現,但如果我在視圖中直接使用promise,我不會處理這種情況。有另一種方法嗎?

謝謝。

+0

剛剛閱讀了有關角度官方文檔的$ q,並且您的上述兩個問題將得到解答 –

+2

似乎#rtfm在這裏沒有幫助,因爲我不想使用承諾編程,而是從視圖中描述在問題/文章中。這似乎並不是文檔的一部分。 – Pipo

回答

13

編輯:由於角度v1.2的resolution of promise in views is not activated by default

視圖中promise的自動解析看起來像一個方便的工具,但它有許多限制需要仔細理解和評估。這種方法最大的問題是,AngularJS會將回調添加到承諾中,而我們對它的控制很少。

回答您的問題:

1)如圖所示,這是最終AngularJS誰將會增加一個成功/錯誤回調,所以我們沒有太多的控制這裏。你可以做的是把原始承諾包裝成一個可以追蹤解決方案的自定義承諾。但是這種巧妙的操作可以節省很少的擊鍵次數。不,沒有像'解決'這樣的事情。簡而言之 - 沒有一種通用的機制來跟蹤可能適用於所有承諾的進展。如果您的承諾爲$http,則可以使用攔截器或pendingRequests屬性來跟蹤正在進行的請求。

2)你不能。再次,AngularJS在$parse服務中添加了一個處理程序,它看起來像這樣:promise.then(function(val) { promise.$$v = val; });(請參閱代碼here)。你可以看到只有一個成功的回調被添加,所有的失敗都將被忽略。

這些不是視圖中自動承諾解析的唯一限制。另一個問題是函數返回的promise不會被正確解析。例如,如果你想重寫一個例子,像這樣:

myModule.controller('HelloCtrl', function($scope, HelloWorld) { 

    $scope.messages = function() { 
    return HelloWorld.getMessages(); 
    } 
}); 

,並嘗試使用下面的標記:如預期

<li ng-repeat="message in messages()"></li> 

事情會的工作,這可能會作爲一個驚喜。

總之:儘管promise的自動解析看起來像是一個方便的捷徑,但它有許多限制和不明顯的行爲。仔細評估這些,並決定是否節省一些擊鍵是值得的。

+0

謝謝您的深入解答。 – Pipo

+2

「函數返回的promise不會被正確解析」,但「事情會按預期工作」 - 不應該是「不會」? ;) – schellmax