当前位置: 代码迷 >> 综合 >> promise Q.all 方法使用 及 spread 分散返回结果
  详细解决方案

promise Q.all 方法使用 及 spread 分散返回结果

热度:49   发布时间:2024-01-10 01:21:50.0

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 实现一个简单的登录拦截器

  相关解决方案