promise Q.all 方法使用 及 spread 分散返回结果
来源:互联网 发布:淘宝隐形牙套有用吗 编辑:程序博客网 时间:2024/05/21 06:34
http://yijiebuyi.com/blog/ff153c94cb841f36b8e5da98242871e0.html
一介布衣 2015-11-12 nodejs 779
promise 规范
点击查看此博文了解 promise规范让你解脱callback回调噩梦
promise 规范 开源包 Q 使用
点击查看博文 node.js下如何使用q
当promise 遇到 forEach
当你的一个业务需要执行多个异步方法时,最后统一返回
计数器法
顾名思义,用一个计数器来统计遍历/调用函数的次数,最后一次统一返回结果
假设我们有一个 实现 promise 规范的函数 test
var test=function(a){ var defer=Q.defer(); defer.resolve(a+1); return defer.promise;}
假设一个业务需要多次执行 test 方法
var sum=function(total){ var defer=Q.defer(); var num=0; for(var i=0,j=total;i<total;i++){ //注意,这里 i 是循环变量, j 是一个计数器(默认10次) test(i).then(function(result){ num+=result; if(--j==0){ defer.resolve(num); } }) } return defer.promise;}
然后我们调用 sum 函数查看返回的结果
sum(10).then(function(result){ console.log('**一介布衣博客:返回结果***',result);})
我们想重复执行10次操作,然后返回实现 promise 规范的结果
上面的方法就是通过一个计数器 j 来统计循环次数,到循环到最后一次遍历时,把结果包装成 promise 规范.
Q 的多次调用异步方法实现
用循环不是特别准备,有时你的业务可能是多次调用不同的异步方法,组装好数据再一次返回.
针对这种应用场景,我们该如何包装一个 promise 规范的函数呢.
Q 里面的 all 方法
all 方法隆重上场了.
它的调用方式是,用数组的形式接收参数,每一个参数就是一个实现了promise 规范的方法,看下面的例子:
我们下面定义3个方法 (都实现了 promise 规范)
var Q=require('q');var test1 = function (data) { var deferred = Q.defer(); deferred.resolve(data+" fun1"); return deferred.promise;}var test2 = function (data) { var deferred = Q.defer(); deferred.resolve(data+" fun2"); return deferred.promise;}var test3 = function (data) { var deferred = Q.defer(); deferred.resolve(data+" fun3"); return deferred.promise;}
我们包装上 3个 不同的异步方法后,下面我们再假设一个业务逻辑需要同时调用上面的 3个异步方法,最后返回promise 规范的结果
Q.all([ test1("test1"),test2("test2"),test3("test3")]).then(function(result){ console.log('***一介布衣博客:***',result);})
结果:
可以看到调用 all 方法以后,then 方法体里拿到一个数组,数组3个元素就是 3个异步方法的返回值.只有全部方法都执行完且成功, all 方法才返回结果.
可见, all 方法可以将多个实现promise 规范的方法当做参数来执行,最后全部执行成功后统一返回各个方法的执行结果数组.
如果你不想把返回结果放到数组里,而是分散开来 spread 派上用场了
spread 的作用是把 all 执行后的结果分散开
比如 上面返回结果是这样的 [ 'test1 fun1’, 'test2 fun2’, ‘test3 fun3’ ]
使用 spread 代码:
Q.all([ test1("test1"),test2("test2"),test3("test3")]).spread(function(r1,r2,r3){ console.log('***一介布衣博客:***',r1,r2,r3);});
r1,r2,r3 分别对应了三个异步方法对应的返回值
出自:promise Q.all 方法使用 及 spread 返回分组结果
你可能感兴趣
- node-webkit 项目中的 package.json 格式
- mac 系统下 如何 彻底 删除 node.js
- node.js AES/ECB/PKCS5Padding 与其他语言的加密解密通用
- ejs母版页让你的node.js应用开发更快更有效- 一介布衣
- node.js 实现一个简单的登录拦截器
- promise Q.all 方法使用 及 spread 分散返回结果
- 使用Promise.all()优化请求
- Node.js中, 使用Q.ninvoke封装对象方法为promise
- angular的$q返回一个可链式调用的promise
- golang通过反射使用json字符串调用struct的指定方法及返回json结果
- ArcGIS JavaScript API使用Promise进行公交换乘查询及结果绘制
- Spread控件的使用经验,技巧,方法
- $q & promise service
- angularJS $q and promise
- angular $q,defer,promise
- $q和promise
- 使用Callable返回结果
- 使用Callable返回结果
- 使用Callable返回结果
- promise.all 异常处理
- AngularJS 的 $q 和 Promise
- Angular的 $q, defer, promise
- nodejs promise for q.js
- 给VS程序添加管理员权限等
- caffe基本构架
- java学习个人笔记---非静态内部类
- php 利用远程图片创建新图片完善(jpg,png,gif)
- Jsoup使用教程(一)
- promise Q.all 方法使用 及 spread 分散返回结果
- vs2010 语法错误: 缺少“;”(在标识符“PVOID64”的前面)
- 怎么查看mysql数据库的版本
- List<?> list= new ArrayList<?>为什么这样写 接口引用指向实现类的对象
- getHibernateTemplate().find()及带参使用方法
- MyEclipse10安装SVN插件
- Nagle算法
- iOS设计模式(二) 简单工厂,工厂,抽象工厂
- VMware Workstation学习之路——网络设置——桥接连接方式