使用AngularJS處理promise的時候,有時會碰到需要處理多個promise的情況。
最簡單的處理就是每個promise都then。如下:
var app = angular.module("app",[]); app.controller("AppCtrl", function($q. $timeout){ var one = $q.defer(); var two = $q.defer(); var three = $q.defer(); $timeout(function(){ one.resolve("one done"); }, Math.random() * 1000) $timeout(function(){ two.resolve("two done"); }, Math.random() * 1000) $timeout(function(){ three.resolve("three done"); }, Math.random() * 1000) functioin success(data){ console.log(data); } one.promise.then(success); two.promise.then(success); three.promise.then(success); })
有沒有更好的方式?
$q.all方法可以接受promise的一個數組,如下呼叫:
var all = $q.all([one.promise, two.promise, three.promise]); all.then(success);
promise?
promise是一種用非同步的方式處理值的方法,promise是對象,代表了一個函數最終可能的返回值或拋出的異常,在與遠端對像打交道時我們可以把他看作是遠端對象的一個代理。 如果說是promise也是非同步處理方式的一種,那我們會想起它和XHR和$.ajax有啥差別呢?
習慣上js使用閉包或回調來對應非同步回傳的數據,例如頁面載入之後的XHR請求。我們可以跟資料進行正常交互,就好像它已經回傳了一樣,而不需要依賴回呼函數的觸發。
那麼ng提出的promise是為了解決什麼問題呢? 回調已經被使用了很長時間,通常如果有回調依賴其他還回調時將會時調試變得非常艱難,每一步調用之後都需要顯示處理錯誤。與之不同的是promise提供了另一個抽象:這些函數傳回promise物件。
為什麼要用promise
使用了promise的收穫之一是逃脫了回調的固定思維邏輯。 promise讓非同步處理的機制看起來更像是同步,基於同步函數我們可以按照預期來捕捉回傳值和異常值。可以在程式中的任何時刻捕捉錯誤,並且繞過依賴程式異常的後續程式碼,我們不需要思考這個同步帶來的好處。因此使用promise的目的是:取得功能組合和錯誤冒泡能力的同時,保持程式碼非同步運作的能力。
promise是頭等對象,自帶了一些約定。
• 只有一個resolve或reject會被呼叫到。
• 如果promise被執行或被拒絕了,依賴他們的處理程序仍然會被呼叫。
• 處理程序總是會被非同步呼叫。