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 相关文章推荐
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
JS操作Cookie写入和读取实例代码
Oct 20 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
在Node.js应用中读写Redis数据库的简单方法
Jun 30 Javascript
jquery radio的取值_radio的选中_radio的重置方法
Sep 20 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
Sep 18 Javascript
layui的table中显示图片方法
Aug 17 Javascript
理顺8个版本vue的区别(小结)
Sep 17 Javascript
Bootstrap Paginator+PageHelper实现分页效果
Dec 29 Javascript
如何在node环境实现“get数据解析”代码实例
Jul 03 Javascript
vue3使用vue-count-to组件的实现
Dec 25 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制作简单的内容采集器的原理分析
2008/10/01 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
php实现网站顶踩功能的完整前端代码
2015/07/19 PHP
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
python模块导入的细节详解
2018/12/10 Python
django 外键model的互相读取方法
2018/12/15 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
学生喝酒检讨书
2014/02/06 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
行政主管职责范本
2014/03/07 职场文书
售后客服个人自我评价
2014/09/14 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
《西门豹》教学反思
2016/02/23 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
python ConfigParser库的使用及遇到的坑
2022/02/12 Python