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 相关文章推荐
你需要知道的JavsScript可以做什么?
Jun 29 Javascript
javascript firefox兼容ie的dom方法脚本
May 18 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
Jun 05 Javascript
动态标签 悬停效果 延迟加载示例代码
Nov 21 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
Jul 21 Javascript
javascript转换日期字符串为Date日期对象的方法
Feb 13 Javascript
Bootstrap的图片轮播示例代码
Aug 31 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
Dec 10 Javascript
Angular2 (RC4) 路由与导航详解
Sep 21 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
详解Vue2.5+迁移至Typescript指南
Aug 01 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
Mac 安装 nodejs方法(图文详细步骤)
2017/10/30 NodeJs
使用JavaScript破解web
2018/09/28 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
Python中的多重装饰器
2015/04/11 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python selenium如何设置等待时间
2016/09/15 Python
python通过zabbix api获取主机
2018/09/17 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
Python列表元素常见操作简单示例
2019/10/25 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
会计专业推荐信
2013/10/29 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
美发活动策划书
2014/01/14 职场文书
辩论赛主持词
2014/03/18 职场文书
综艺节目策划方案
2014/06/13 职场文书
村创先争优活动总结
2014/08/28 职场文书
催款律师函范文
2015/05/27 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
Python+Appium新手教程
2021/04/17 Python