http://code.angularjs.org/1.2.6/docs/api/ng.$qangularjs
$q service 四個方法函數 , 按照我的理解劃分爲三類。api
非鏈式調用數組
$q.when(value)
promise
Returns a promise of the passed value or promise
傳遞變量值,promise.then()執行成功回調函數
$q.all(promises)
code
Combines multiple promises into a single promise that is resolved when all of the input promises are resolved.
多個promise必須執行成功,才能執行成功回調,傳遞值爲數組或哈希值,數組中每一個值爲與Index對應的promise對象。對象
錯誤信息傳遞ip
$q.reject(reason)
文檔
Returns a promise that was already resolved as rejected with the reason.
返回一個失敗緣由,promise.then()執行失敗回調get
鏈式調用
$q.defer()
返回一個deferred對象
鏈式調用內部的默認失敗回調會向後傳遞異常,因此爲避免麻煩,且不在乎每一處的業務邏輯錯誤,不要在每一處then()
處聲明異常處理函數,在最後一個 then()
中聲明便可。
promiseX.then(function(){}).then(function(){}) .then(function(val){},function(reason){})
若是在乎每一處可能出現的業務邏輯錯誤,在回調中return $q.reject();
傳遞錯誤.不管執行哪個回調函數,若是內部沒有人爲return $q.reject();
,則若沒有執行錯誤,暨返回成功信號。
var deferred = $q.defer(); deferred.resolve(1); var promiseA = deferred.promise; promiseA .then(function(val){$log.info(val);return ++val;}) .then(function(val){$log.info(val);return ++val;}) .then( function(val){$log.info(val);return ++val;}, function(val){$log.info(val)} );
鏈式調用完成後控制檯打印出 1,2,3
var deferred = $q.defer(); deferred.resolve(1); var promiseA = deferred.promise; promiseA .then(function(val){$log.info(val);return $q.reject(15);}) .then(function(val){$log.info(val);return ++val;}) .then(function(val){$log.info(val);return ++val;}) .then(function(val){$log.info(val);return ++val;}) .then( function(val){$log.info(val);return ++val;}, function(val){$log.info(val)} );
鏈式調用完成後控制檯打印出 1,15,能夠看出,第一個return $q.reject(15)
以後,直到最後一個then()
纔有錯誤回調函數,因此異常一直傳遞到最後,中間的幾個then()
沒有錯誤回調函數。
$q.when('I Love you!') .then(function(value){$log.info(value)});
控制檯打印出I Love you!;
$q.when($q.reject('I Hate you!')) .then(null,function(value){$log.info(value)});
控制檯打印出I Hate you!;
var promiseA = $q.when('I Love you!'); var promiseB = $q.when('Love story!'); var promiseC = $q.when("Let't get wet!"); $q.all([promiseA,promiseB,promiseC]).then(function(value){ value[0].then(function(value){$log.info(value);}) value[1].then(function(value){$log.info(value);}) value[2].then(function(value){$log.info(value);}) })
控制檯打印出I Love you!,Love story!,"Let't get wet!