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
AngularJS 中的Promise --- $q服务详解相关推荐
- angular中的$q使用详解
AngularJS 中的Promise --- $q服务详解 先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQ ...
- angular $q promise详解
前言 通过本文,你大概能清楚angular promise是个啥,$q又是个啥,以及怎么用它.这里咱们先灌输下promise的思想. 下面写的全是废话,一些看着高逼格其实没什么大作用的概念,想知道$q ...
- SSH 服务详解 (三)-- 使用 SSH 代理
SSH 服务详解 (三)-- 使用 SSH 代理 SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 ...
- java 静态 编译_Java中的动态和静态编译实例详解
Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...
- STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解
一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的. Corte ...
- oracle如何启动和停止服务,CentOS启动和停止服务详解
CentOS启动和停止服务详解 服务简介 Linux 系统服务是在Linux启 动时自动加载, 服务的添加.删除.自动运行及状态 CAMS 在安装过程中会自动添加相关的服务,例如: service c ...
- python中mat函数_python matplotlib中的subplot函数使用详解
python里面的matplotlib.pylot是大家比较常用的,功能也还不错的一个包.基本框架比较简单,但是做一个功能完善且比较好看整洁的图,免不了要网上查找一些函数.于是,为了节省时间,可以一劳 ...
- Python中的select、epoll详解
Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...
最新文章
- 成功解决ValueError: column index (256) not an int in range(256)
- 计算机专业相关分类调研
- SQL Server 审核(Audit)-- 创建数据库级别的审核
- SAP UI5 初学者教程之二十四 - 如何使用 OData 数据模型试读版
- 高并发下防止库存超卖解决方案
- 深度linux登录后界面卡死,Deepin Linux 15(.1)启动即卡死的问题
- java中的URLConnection
- 谷歌SEO优化排名做法详解,看这篇就都懂了
- 振兴会杜振国分析美股行情
- 计算机网络工程师 考试题,计算机四级网络工程师考试题及答案.docx
- matlab求解微分方程ode23
- PureMVC 实例讲解
- SublimeLinter进行PHP代码检查
- Mysql数据库和navicat
- text-decoration属性
- 他是互联网顶尖大佬,创办并掌舵Facebook多年,现在却被要求辞职
- 双十二:2017这些活动不可错过
- 通用Mapper使用
- 路由器上静态路由设置,实现不在通一网段的网络通信方法
- 借助免费AI艺术平台生成头像
热门文章
- mysql删掉数据库失败_如何删除MySQL数据库?
- 【JSOI2016】【st表/猫树】【枚举】灯塔
- Tower for Mac(强大的Git客户端)
- 信息安全原理与实践学习
- AutoSAR系列讲解(实践篇)7.5-OS原理进阶(上)
- java isempty用法_Java String 的 isEmpty() 与 null 与 区别解析
- fsk调制解调实验报告 matlab,FSK调制解调MATLAB源代码
- 傅里叶变换 高通滤波 低通滤波
- IntelliJ IDEA 2018.2 免费激活方式
- Springboot RabbitMQ 基础使用、消息发送确认、签收