AngularJS 中的Promise --- $q服务详解

先说说什么是Promise,什么是$q吧。Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered。

什么是Promise

以前了解过Ajax的都能体会到回调的痛苦,同步的代码很容易调试,但是异步回调的代码,会让开发者陷入泥潭,无法跟踪,比如:

funA(arg1,arg2,function(){funcB(arg1,arg2,function(){funcC(arg1,arg2,function(){xxxx....})})
})

本身嵌套就已经很不容易理解了,加上不知何时才触发回调,这就相当于雪上加霜了。

但是有了Promise这种规范,它能帮助开发者用同步的方式,编写异步的代码,比如在AngularJS中可以使用这种方式:

deferABC.resolve(xxx)
.then(funcSuccess(){},funcError(){},funcNotify(){});

当resolve内的对象成功执行,就会触发funcSuccess,如果失败就会触发funcError。有点类似

deferABC.resolve(function(){Sunccess:funcSuccess,error:funcError,notify:funcNotify
})

再说的直白点,Promise就是一种对执行结果不确定的一种预先定义,如果成功,就xxxx;如果失败,就xxxx,就像事先给出了一些承诺。

比如,小白在上学时很懒,平时总让舍友带饭,并且事先跟他说好了,如果有韭菜鸡蛋就买这个菜,否则就买西红柿炒鸡蛋;无论买到买不到都要记得带包烟。

小白让舍友带饭()
.then(韭菜鸡蛋,西红柿炒鸡蛋)
.finally(带包烟)

$q服务

q服务是AngularJS中自己封装实现的一种Promise实现,相对与Kris Kwal's Q要轻量级的多。
先介绍一下$q常用的几个方法:

  • defer() 创建一个deferred对象,这个对象可以执行几个常用的方法,比如resolve,reject,notify等
  • all() 传入Promise的数组,批量执行,返回一个promise对象
  • when() 传入一个不确定的参数,如果符合Promise标准,就返回一个promise对象。

在Promise中,定义了三种状态:等待状态,完成状态,拒绝状态。

关于状态有几个规定:

  • 1 状态的变更是不可逆的
  • 2 等待状态可以变成完成或者拒绝

defer()方法

在$q中,可以使用resolve方法,变成完成状态;使用reject方法,变成拒绝状态。

下面看看 $q的简单使用:

<html ng-app="myApp">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
</head>
<body><div ng-controller="myctrl">{{test}}</div><script type="text/javascript">var myAppModule = angular.module("myApp",[]);myAppModule.controller("myctrl",["$scope","$q",function($scope, $ q ){$scope.test = 1;//这个只是用来测试angularjs是否正常的,没其他的作用var defer1 = $q.defer();var promise1 = defer1.promise;promise1.then(function(value){console.log("in promise1 ---- success");console.log(value);},function(value){console.log("in promise1 ---- error");console.log(value);},function(value){console.log("in promise1 ---- notify");console.log(value);}).catch(function(e){console.log("in promise1 ---- catch");console.log(e);}).finally(function(value){console.log('in promise1 ---- finally');console.log(value);});defer1.resolve("hello");// defer1.reject("sorry,reject");}]);</script>
</body>
</html>

其中defer()用于创建一个deferred对象,defer.promise用于返回一个promise对象,来定义then方法。then中有三个参数,分别是成功回调、失败回调、状态变更回调。

其中resolve中传入的变量或者函数返回结果,会当作第一个then方法的参数。then方法会返回一个promise对象,因此可以写成

xxxx
.then(a,b,c)
.then(a,b,c)
.then(a,b,c)
.catch()
.finally()

继续说说上面那段代码,then...catch...finally可以想想成java里面的try...catch...finally。

all()方法

这个all()方法,可以把多个primise的数组合并成一个。当所有的promise执行成功后,会执行后面的回调。回调中的参数,是每个promise执行的结果。
当批量的执行某些方法时,就可以使用这个方法。

            var funcA = function(){console.log("funcA");return "hello,funA";}var funcB = function(){console.log("funcB");return "hello,funB";}$q.all([funcA(),funcB()]).then(function(result){console.log(result);});

执行的结果:

funcA
funcB
Array [ "hello,funA", "hello,funB" ] 

when()方法

when方法中可以传入一个参数,这个参数可能是一个值,可能是一个符合promise标准的外部对象。

            var funcA = function(){console.log("funcA");return "hello,funA";}$q.when(funcA()).then(function(result){console.log(result);});

当传入的参数不确定时,可以使用这个方法。

hello,funA

angular中的$q使用详解相关推荐

  1. angular $q promise详解

    前言 通过本文,你大概能清楚angular promise是个啥,$q又是个啥,以及怎么用它.这里咱们先灌输下promise的思想. 下面写的全是废话,一些看着高逼格其实没什么大作用的概念,想知道$q ...

  2. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  3. php dump函数详解,php中var_dump()函数的详解说明

    本文章给大家全面的介绍一下关于php中var_dump()函数用法详解,大家可参考参考. var_dump()void var_dump ( mixed expression [, mixed exp ...

  4. linux系统里route -n不起作用,Linux系统中traceroute命令使用详解

    Linux系统中traceroute命令可以追踪到网络数据包的路由途径.下面由学习啦小编为大家整理了linux系统中traceroute命令使用详解,希望对大家有帮助! Linux系统中tracero ...

  5. access中的Format用法详解

    access中的Format用法详解 Format$(Now,"EEOA") 只要这么一句~~~~~就可以得到" 二○○六年五月二十六日" ---------- ...

  6. JS中的event 对象详解

    JS中的event 对象详解 JS的event对象 Event属性和方法: 1. type:事件的类型,如onlick中的click: 2. srcElement/target:事件源,就是发生事件的 ...

  7. Go中strings的常用方法详解

    string操作在编程中具有极高的频率,那么string中有哪些有用的方法呢? 使用strings直接操作 Compare func Compare(a, b string) int 按照字典序比较两 ...

  8. python开发的程序中以电子表格显示数据_使用 Python 读取电子表格中的数据实例详解...

    Python 是最流行.功能最强大的编程语言之一.由于它是自由开源的,因此每个人都可以使用.大多数 Fedora 系统都已安装了该语言.Python 可用于多种任务,其中包括处理逗号分隔值(CSV)数 ...

  9. 在Linux中ipcs命令,linux中ipcs命令使用详解

    linux中ipcs命令使用详解 用途 报告进程间通信设施状态. 语法 代码如下: ipcs [-mqs] [-abcopt] [-C core] [-N namelist] -m 输出有关共享内存( ...

最新文章

  1. 软件开发文档整理(之)一张示意图 | 清晰明了
  2. [KISSY5系列]淘宝全终端框架 KISSY 5--从零开始使用
  3. Linux服务器---phpMyAdmin
  4. Android 开源框架 ( 二 ) 基于OkHttp进一步封装的okhttp-utils介绍
  5. cuda编程python接口_混合编程[python+cpp+cuda]
  6. 镜像数据库上SQL Server复制
  7. java默认virtual_mac jdk配置(系统默认or自己配置)
  8. POJ-1903 Jurassic Remains
  9. Python爬取天气信息
  10. brew mysql要多久_mac brew 安装 mysql
  11. TMOD 计时器 计数器
  12. Arrays.sort()和lambda表达式
  13. 菲仕乐高压锅型号全面详解
  14. 所处网络导致虚拟机的域名解析失败
  15. 2024 递归Eason
  16. 一篇文章,只用看三遍,终生不忘网络分层
  17. 照片文件与计算机系统,照片文件格式怎么修改
  18. css属性:hover
  19. 计算机要执行一条指令,cpu所涉及的操作应该包括下列的,计算机一级填空选择题与答案.doc...
  20. 神舟z7m安装Linux,神舟战神Z7M U盘装系统win8教程

热门文章

  1. 【电子文档】大批量电子文档的自动化生成 - 第一版
  2. 【构建PB级准实时分析引擎】 -- azkaban、airflow、dolphinscheduler、quartz、xxl-job 、oozie调度方案评测
  3. 怎么买企业邮箱最省钱,买企业邮箱省钱秘笈!
  4. 体验文心一言AI大模型生成刘强东和章泽天简介
  5. unsafe java_java Unsafe详细解析
  6. GoLang之unsafe分析
  7. Java图像检索库Lire:基本介绍
  8. 机器学习——监督学习和无监督学习的区别
  9. 扫雷-单机游戏-微信小游戏项目开发入门
  10. HalfLife Ragdoll Dev Notes