先说说什么是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

AngularJS 中的Promise --- $q服务详解相关推荐

  1. angular中的$q使用详解

    AngularJS 中的Promise --- $q服务详解 先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQ ...

  2. angular $q promise详解

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

  3. SSH 服务详解 (三)-- 使用 SSH 代理

    SSH 服务详解 (三)-- 使用 SSH 代理 SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 ...

  4. java 静态 编译_Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...

  5. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  6. STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解

    一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的. Corte ...

  7. oracle如何启动和停止服务,CentOS启动和停止服务详解

    CentOS启动和停止服务详解 服务简介 Linux 系统服务是在Linux启 动时自动加载, 服务的添加.删除.自动运行及状态 CAMS 在安装过程中会自动添加相关的服务,例如: service c ...

  8. python中mat函数_python matplotlib中的subplot函数使用详解

    python里面的matplotlib.pylot是大家比较常用的,功能也还不错的一个包.基本框架比较简单,但是做一个功能完善且比较好看整洁的图,免不了要网上查找一些函数.于是,为了节省时间,可以一劳 ...

  9. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

最新文章

  1. 成功解决ValueError: column index (256) not an int in range(256)
  2. 计算机专业相关分类调研
  3. SQL Server 审核(Audit)-- 创建数据库级别的审核
  4. SAP UI5 初学者教程之二十四 - 如何使用 OData 数据模型试读版
  5. 高并发下防止库存超卖解决方案
  6. 深度linux登录后界面卡死,Deepin Linux 15(.1)启动即卡死的问题
  7. java中的URLConnection
  8. 谷歌SEO优化排名做法详解,看这篇就都懂了
  9. 振兴会杜振国分析美股行情
  10. 计算机网络工程师 考试题,计算机四级网络工程师考试题及答案.docx
  11. matlab求解微分方程ode23
  12. PureMVC 实例讲解
  13. SublimeLinter进行PHP代码检查
  14. Mysql数据库和navicat
  15. text-decoration属性
  16. 他是互联网顶尖大佬,创办并掌舵Facebook多年,现在却被要求辞职
  17. 双十二:2017这些活动不可错过
  18. 通用Mapper使用
  19. 路由器上静态路由设置,实现不在通一网段的网络通信方法
  20. 借助免费AI艺术平台生成头像

热门文章

  1. mysql删掉数据库失败_如何删除MySQL数据库?
  2. 【JSOI2016】【st表/猫树】【枚举】灯塔
  3. Tower for Mac(强大的Git客户端)
  4. 信息安全原理与实践学习
  5. AutoSAR系列讲解(实践篇)7.5-OS原理进阶(上)
  6. java isempty用法_Java String 的 isEmpty() 与 null 与 区别解析
  7. fsk调制解调实验报告 matlab,FSK调制解调MATLAB源代码
  8. 傅里叶变换 高通滤波 低通滤波
  9. IntelliJ IDEA 2018.2 免费激活方式
  10. Springboot RabbitMQ 基础使用、消息发送确认、签收