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 對象就是暴露了 promisepromise 對象相關的方法,而我們得到的 promise 對象就可以拿來註冊回調函數。

promise.then(function () { 
  // do something...
});

最後呢,我們就可以透過 deferred 物件去使用 resolvereject 代表成功或失敗回調。

deferred.resolve('any thing');  // 成功回調
deferred.reject('any thing');  // 失敗回調

當然最強大的就是它的 chain 鍊式編程,它闡述了一個強大的概念,能夠在返回新的 promise 對象,那麼 chain 會暫停直到返回的對象被 resolve,使你能夠編寫多個非同步函數調用。

JS Bin

這裡沒有提及 $q 其他幾個方法是因為聚焦在 promise 的使用與鍊式寫法。

results matching ""

    No results matching ""