編輯:由於角度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的自動解析看起來像是一個方便的捷徑,但它有許多限制和不明顯的行爲。仔細評估這些,並決定是否節省一些擊鍵是值得的。
剛剛閱讀了有關角度官方文檔的$ q,並且您的上述兩個問題將得到解答 –
似乎#rtfm在這裏沒有幫助,因爲我不想使用承諾編程,而是從視圖中描述在問題/文章中。這似乎並不是文檔的一部分。 – Pipo