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 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
jquery学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
jQuery中:checked选择器用法实例
Jan 04 Javascript
javascript父子页面通讯实例详解
Jul 17 Javascript
Bootstrap实现登录校验表单(带验证码)
Jun 23 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
浅谈JS封闭函数、闭包、内置对象
Jul 18 Javascript
vue-router中scrollBehavior的巧妙用法
Jul 09 Javascript
ajax跨域访问遇到的问题及解决方案
May 23 Javascript
javascript canvas检测小球碰撞
Apr 17 Javascript
小程序实现筛子抽奖
May 26 Javascript
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
SONY ICF-F10中波修复记
2021/03/02 无线电
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
Array.prototype 的泛型应用分析
2010/04/30 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
js单线程的本质 Event Loop解析
2019/10/29 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python中的zip函数使用示例
2015/01/29 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
基于python监控程序是否关闭
2020/01/14 Python
python字符串判断密码强弱
2020/03/18 Python
Python 如何在字符串中插入变量
2020/08/01 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
土木工程专业大学毕业生求职信
2013/10/13 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS