好好爱自己!

这篇讲angular 的$q的讲得不错

原文: https://segmentfault.com/a/1190000000402555

------------------------------------------------------

方法简介

$q service 四个方法函数 , 按照个人理解划分为三类。

  1. 非链式调用

    $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对象。

  2. 错误信息传递

    $q.reject(reason)

    Returns a promise that was already resolved as rejected with the reason.
    返回一个失败原因,promise.then()执行失败回调

  3. 链式调用

    $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!

posted @   立志做一个好的程序员  阅读(382)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2016-11-14 Changing a remote's URL
2016-11-14 Wix打包系列(一)如何使用wix制作安装程序
2016-11-14 服务器修改 ssh 22端口
2016-11-14 服务器遭受 ssh 攻击
2016-11-14 angularJS 系列(六)---$emit(), $on(), $broadcast()的使用
2016-11-14 angularJS 系列(五)--controller AS 语法

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示