$q service in module ng (转)
转载自:https://segmentfault.com/a/1190000000402555
方法简介
$q service 四个方法函数 , 按照个人理解划分为三类。
-
非链式调用
$q.when(value)Returns a promise of the passed value or promise 传递变量值,promise.then()执行成功回调
$q.all(promises)Combines multiple promises into a single promise that is resolved when all of the input promises are resolved. 多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与Index对应的promise对象。
-
错误信息传递
$q.reject(reason)Returns a promise that was already resolved as rejected with the reason. 返回一个失败原因,promise.then()执行失败回调
-
链式调用
$q.defer()返回一个deferred对象
- resolve(value) – 简化说明 配置该deferred对象promise的成功调用函数参数
- reject(reason) – 简化说明 配置该deferred对象promise的失败调用函数参数
- promise - 简化说明 配置后的promise对象
个人理解说明
链式调用内部的默认失败回调会向后传递异常,所以为避免麻烦,且不在意每一处的业务逻辑错误,不要在每一处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!
浙公网安备 33010602011771号