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 获取图片颜色
Apr 05 Javascript
javascript 简单抽屉效果的实现代码
Mar 09 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
Mar 21 Javascript
js计算文本框输入的字符数
Oct 23 Javascript
jQuery 操作input中radio的技巧
Jul 18 Javascript
Angularjs中使用指令绑定点击事件的方法
Mar 30 Javascript
jQuery中extend函数简单用法示例
Oct 11 jQuery
three.js加载obj模型的实例代码
Nov 10 Javascript
JS实现十字坐标跟随鼠标效果
Dec 25 Javascript
10行原生JS实现文字无缝滚动(超简单)
Jan 02 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
Jan 25 Javascript
图文讲解vue的v-if使用方法
Feb 11 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
php 小乘法表实现代码
2009/07/16 PHP
php修改时间格式的代码
2011/05/29 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
使用js实现数据格式化
2014/12/03 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
解读Python中degrees()方法的使用
2015/05/18 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
python中int与str互转方法
2018/07/02 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
python datetime处理时间小结
2020/04/16 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
美国性感女装网站:bebe
2017/03/04 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
酒店营销策划方案
2014/02/07 职场文书
职业女性的职业规划
2014/03/04 职场文书
目标责任书范本
2014/04/16 职场文书
药店采购员岗位职责
2014/09/30 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers