在使用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被執行或者被拒絕了,依賴於他們的處理常式仍然會被調用。
• 處理常式總是會被非同步呼叫。