Promise
Deferred、Promise 有開發前端一陣子的開發人員一定都聽過,最早接觸到得應該是 jQuery Deferred 物件(依 CommonJS PromiseA 實作),大多人看完文件還是看不懂它要表達什麼,我認為是因為範例沒有充分的講解 chain 的編程模式。
前一章提到的 $http
服務就是在這之上封裝出來的,而 ng 內建的 $q 這個服務提供了開發者能夠簡單的使用 Promise。
使用的方法如下
- 透過 $q 服務創造 deferred 實例
- 透過 deferred 實例的 promise 屬性獲得 promise 對象
- promise 對象定義 callback
- deferred 負責觸發回調
var deferred = $q.defer(); // 創建 deferred 實例
var promise = deferred.promise; // 獲取 promise 對象
defer
對象就是暴露了 promise
和 promise
對象相關的方法,而我們得到的 promise 對象就可以拿來註冊回調函數。
promise.then(function () {
// do something...
});
最後呢,我們就可以透過 deferred
物件去使用 resolve
或 reject
代表成功或失敗回調。
deferred.resolve('any thing'); // 成功回調
deferred.reject('any thing'); // 失敗回調
當然最強大的就是它的 chain
鍊式編程,它闡述了一個強大的概念,能夠在返回新的 promise
對象,那麼 chain
會暫停直到返回的對象被 resolve
,使你能夠編寫多個非同步函數調用。
這裡沒有提及 $q
其他幾個方法是因為聚焦在 promise
的使用與鍊式寫法。