AngularJS中处理多个promise的方式


Posted in Javascript onFebruary 02, 2016

在使用AngularJS中处理promise的时候,有时会碰到需要处理多个promise的情况。

最简单的处理就是每个promise都then。如下:

var app = angular.module("app",[]);
app.controller("AppCtrl", function($q. $timeout){
var one = $q.defer();
var two = $q.defer();
var three = $q.defer();
$timeout(function(){
one.resolve("one done");
}, Math.random() * 1000)
$timeout(function(){
two.resolve("two done");
}, Math.random() * 1000) 
$timeout(function(){
three.resolve("three done");
}, Math.random() * 1000) 
functioin success(data){
console.log(data);
}
one.promise.then(success);
two.promise.then(success);
three.promise.then(success);
})

有没有更好的方式?

$q.all方法可以接受promise的一个数组,按如下调用:

var all = $q.all([one.promise, two.promise, three.promise]);
all.then(success);

什么是promise?

promise是一种用异步的方式处理值的方法,promise是对象,代表了一个函数最终可能的返回值或者抛出的异常,在与远程对象打交道时我们可以把他看作是远程对象的一个代理。 如果说是promise也是异步处理方式的一种,那么我们会想起它和XHR和$.ajax有啥区别呢?

习惯上js使用闭包或者回调来相应非同步返回的数据,比如页面加载之后的XHR请求。我们可以跟数据进行正常交互,就好像它已经返回了一样,而不需要依赖回调函数的触发。

那么ng提出的promise是为了解决什么问题呢? 回调已经被使用了很长时间,通常如果有回调依赖其他还回调时将会时调试变得非常艰难,每一步调用之后都需要显示处理错误。与之不同的是promise提供了另外一个抽象:这些函数返回promise对象。

为什么使用promise

使用了promise的收获之一是逃脱了回调的固定思维逻辑。promise让异步处理的机制看上去更像是同步,基于同步函数我们可以按照预期来捕获返回值和异常值。可以在程序中的任何时刻捕捉错误,并且绕过依赖于程序异常的后续代码,我们不需要思考这个同步带来的好处。因此使用promise的目的是:获取功能组合和错误冒泡能力的同时,保持代码异步运行的能力。

promise是头等对象,自带了一些约定。

• 只有一个resolve或者reject会被调用到。

• 如果promise被执行或者被拒绝了,依赖于他们的处理程序仍然会被调用。

• 处理程序总是会被异步调用。

Javascript 相关文章推荐
Javascript学习笔记二 之 变量
Dec 15 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
May 23 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
May 07 Javascript
js命名空间写法示例
Dec 18 Javascript
JavaScript代码实现左右上下自动晃动自动移动
Apr 08 Javascript
jquery checkbox的相关操作总结
Oct 17 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
Oct 21 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
深入理解Node中的buffer模块
Jun 03 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
Jul 11 Javascript
vue中实现回车键登录功能
Feb 19 Javascript
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
AngularJS数据源的多种获取方式汇总
Feb 02 #Javascript
多种JQuery循环滚动文字图片效果代码
Jun 23 #Javascript
三种AngularJS中获取数据源的方式
Feb 02 #Javascript
原生JS实现拖拽图片效果
Aug 27 #Javascript
基于jquery实现下拉框美化特效
Feb 02 #Javascript
AngularJS自动表单验证
Feb 01 #Javascript
javascript实现右侧弹出“分享到”窗口效果
Feb 01 #Javascript
You might like
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
详解参数传递四种形式
2015/07/21 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
Vue渲染函数详解
2017/09/15 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
webpack之devtool详解
2018/02/10 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
利用python代码写的12306订票代码
2015/12/20 Python
python Opencv将图片转为字符画
2021/02/19 Python
Python实现的堆排序算法示例
2018/04/29 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
Python中的枚举类型示例介绍
2019/01/09 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
Python属性和内建属性实例解析
2020/01/14 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
思想品德自我评价
2014/02/04 职场文书
珍惜资源的建议书
2014/08/26 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
健康状况证明模板
2014/10/23 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
聚会通知怎么写
2015/04/23 职场文书
2015年财政局工作总结
2015/05/21 职场文书