天天看點

AngularJs $q 承諾與延遲

$q

一個幫助處理異步執行函數的服務。當他們做完處理時,使用它們的傳回值(或異常)。

受 Kris Kowa’s Q 的啟發,這是一個實作promise/deferred對象的啟用。

$q的兩種方式---這是一個更類似于Kris Kowal Q或jQuery的遞延實作,另一種在一定程度上類似的ES6承諾。

Deferred Api

一個被$q.defer()調用的deferred的新執行個體。

deferred對象的目的是暴露相關承諾執行個體,以及APIs被執行的成功或不成功情況,以及任務的狀态。

方法:

resolve(value):根據value以解決派生的promise。如果值是通過$q.reject構造的rejection 對象,該promise将被拒絕。

reject(reason):根據reason以拒絕派生的promise。這相當通過 $q.reject構造的rejection 對象來解決。

notify(value):在 promise 被執行的過程中提供狀态更新情況。這可能會被多次調用,在promise是被解決還是被拒絕之前。

屬性:

promise:承諾,與這個延遲相關的承諾對象。

Promise Api

當一個deferred執行個體被建立時,一個promise執行個體被建立,并且可以通過調用deferred.promise檢索。Promise對象的目的是當它完成後允許需要的地方獲得延遲任務的結果。

then(successCallback,errorCallback,notifyCallback);

無論什麼時候,promise是已經(将要)被解決或拒絕,隻要結果是可用的,就調用一個成功/錯誤的回調異步。回調函數帶着一個參數被調用:解決的結果或拒絕的原因。此外,在承諾被解決或被拒絕之前,通知回調可能被調用0或多次用來提供一個訓示進度。

這個方法傳回被successCallback/errorCallback的解決或拒絕的傳回值作為一個新的承諾(除非傳回值是個promise,在承諾鍊的承諾和值都被解決的情況下)。它還将通過notifycallback方法的傳回值進行通知。promise 不能從notifyCallback方法得到解決或拒絕 。

catch(errorCallback);

promise.then(null, errorCallback) 的快捷方式。

finally(callback,notifyCallback);

允許你觀察一個承諾的解決或拒絕,但這樣做不能修改最後的值。這可用于promise不論是被解決或拒絕後釋放資源或做一些清理。

鍊式承諾

因為調用本次promise的方法将會傳回一個新的延生的promise,它很容易建立一個承諾鍊:

當一個承諾解決另一個承諾(這将推遲其進一步的解決)可能建立一個任何長度的鍊。它可能在鍊中的任何處暫停/推遲承諾。這使得它可以像$http的響應攔截這類強大的API。

Kris Kowal’s Q和$q的不同

以下是兩個主要的不同:

在Angular裡,$q和$rootScope.Scope Scope模型的觀察機制內建,這意味着更快的将解決/拒絕的結果傳播到你的model和避免不必要的浏覽器重新渲染(這将導緻ui的閃爍)。

Q比$q有更多的特性,但這是以位元組為代價的。$q是小版本的,但包含所有常見的異步任務所重要的功能。

依賴:$rootScope

使用:$q(resolver);

defer();

建立一個deferred對象,它代表一個将在将來完成的任務。傳回一個deferred的新執行個體。

reject(reason);

建立一個由指定的理由拒絕的承諾。在承諾鍊中,這個api将被用于承諾的拒絕。如果你正在處理一個承諾鍊的最後一個承諾,那麼你不需要擔心它。

reason:常數,消息,異常或一個對象表示拒絕原因。

傳回一個已經根據拒絕原因解決了的承諾。

when(value);

将一個對象或者一個值或者一個第三方承諾包裝進$q承諾。當你處理一個可能是承諾或可能不是承諾或承諾來自一個不可信的來源的對象。

value:值或者承諾。

傳回一個承諾。

resolve(value);

when的别名,為了與ES6保持一緻。

all(promises);

當所有承諾都得到解決後,在一個單一的承諾裡集合多個被解決的承諾。

promises:承諾的數組或者哈希。

傳回一個将被結合一個數組/哈希或者值解決的單一的承諾,每個值在相同索引/鍵的數組/哈希承諾對應相對承諾,如果有任何承諾被拒絕,這将導緻承諾被以相同的拒絕值拒絕。

使用代碼:

承諾鍊:

.when():

.all():

繼續閱讀