如何通过使用Q来并发执行多个promises呢?

Q(Q(1), Q(2), Q(3)).then(function (one, two, three) { console.log(one);console.log(two);console.log(three);}, function (ex) {console.error(ex.stack);});
// 1

  上面的代码输出结果为1。很显然,你不能简单地将各个promises都放到一个Q()函数里来执行,这样只有第一个promise会被正确地执行,剩余的都会被忽略掉。

  你可以使用Q.all来代替上面的方法,它们之间的主要区别是前者将每个promise单独作为参数进行传递,而Q.all则接收一个数组,所有要并行处理的promise都放到数组中,而数组被作为一个独立的参数传入。

Q.all([Q(1), Q(2), Q(3)]).then(function (one, two, three) {console.log(one);console.log(two);console.log(three);}, function (ex) {console.error(ex.stack);});
// [1,2,3]

  上面的代码输出结果为[1, 2, 3]。所有的promises都被正确执行,但是你发现Q.all返回的结果依然是一个数组。我们也可以通过下面这种方式来获取promises的返回值:

Q.all([Q(1), Q(2), Q(3)]).then(function (one, two, three) {console.log(one[0]);console.log(one[1]);console.log(one[2]);}, function (ex) {console.error(ex.stack);});
// 1
// 2
// 3

  除此之外,我们还可以将then替换成spread,让Q返回一个个独立的值而非数组。和返回数组结果的方式相同,这种方式返回结果的顺序和传入的数组中的promise的顺序也是一致的。

Q.all([Q(1), Q(2), Q(3)]).spread(function (one, two, three) {console.log(one);console.log(two);console.log(three);}, function (ex) {console.error(ex.stack);});
// 1
// 2
// 3

  那如果其中的一个或多个promsie执行失败,被rejected或者throw error,我们如何处理错误呢?

Q.all([Q(1), Q.reject('rejected!'), Q.reject('fail!')]).spread(function (one, two, three) {console.log(one);console.log(two);console.log(three);}, function (reason, otherReason) {console.log(reason);console.log(otherReason);});
// rejected!
// undefined

  如果传入的promises中有一个被rejected了,它会立即返回一个rejected,而其它未完成的promises不会再继续执行。如果你想等待所有的promises都执行完后再确定返回结果,你应当使用allSettled

Q.allSettled([Q(1), Q.reject('rejected!'), Q.reject('fail!')])
.then(function (results) {results.forEach(function (result) {if (result.state === "fulfilled") {console.log(result.value);} else {console.log(result.reason);}});
});
// 1
// rejected!
// fail!

使用Q进行同步的Promises操作相关推荐

  1. 秒杀多线程第十二篇 多线程同步内功心法——PV操作上

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  2. Java内存模型 - 同步八种操作

    Java 内存模型 - 同步操作与规则 Java内存模型 - 同步八种操作 锁定(lock): 作用于主内存中的变量,将他标记为一个线程独享变量. 通常意义上的上锁,就是一个线程正在使用时,其他线程必 ...

  3. 【互斥同步经典PV操作】

    互斥同步经典PV操作 内容来自B站王道老师计算机考研操作系统讲解 文章目录 互斥同步经典PV操作 一.单生产者和消费者 二.多生产者和多消费者 三.吸烟问题 四.读者与写者问题 总结 一.单生产者和消 ...

  4. 多线程面试题系列(12):多线程同步内功心法——PV操作上

    上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点.本文将会先简要介绍下P ...

  5. android10全面屏手势 操作图,全面屏手势浪潮来临?安卓Q测试版新发现,手势操作十分便捷...

    近两年来手机最大的变化是什么?除了越来越多的摄像头数量,就是屏幕进一步变大,试图占据手机的整个正面. 虽说能够显示的内容更多了,但是传统的点按操作并不顺畅,于是一些厂商带来了全面屏手势解决了这个问题. ...

  6. 关于java用Quertz定时进行数据库同步的简单操作

    1. 首先需要添加定时器Quertz的依赖 <dependency><groupId>org.quartz-scheduler</groupId><artif ...

  7. java pv操作_理解同步的PV操作

    PV操作是Edsger Dijkstra提出的一种经典的解决同步不同执行线程的问题的方法,这种方法是基于一种叫信号量的特殊变量来实现的. 简单理解为就是通过共享变量+信号量实现的一种同步机制,其应用与 ...

  8. 20170825 - Q - 集合框架 、 集合操作 —— 线性表

    1 什么时候需要泛型? 2 泛型实际上真的泛型了吗? 3 哪些集合可以排序? 4 下方代码是否会报错 public class Collections_sort { public static voi ...

  9. 文章同步多平台操作教程!

    近年来,随着新媒体的发展,新媒体平台如雨后春笋般涌现.然而,当谈到实际操作时,您会发现它确实很麻烦.每天登录一个又一个帐户,然后查看收入.阅读和其他数据.要完成内容,然后打开每个帐户进行一次又一次的复 ...

最新文章

  1. Npm 5 package locks
  2. 高斯模糊与高反差保留
  3. SpringCloud使用Sofa-lookout监控(基于Eureka)
  4. JavaScript中整型数据使用
  5. version `ZLIB_1.2.3.4' not found 解决方法
  6. Zookeeper的配置文件
  7. 最短路径算法----floyd(转)
  8. 【评论】GNU/Linux下有多少是GNU的?
  9. Nginx中break和last的区别
  10. php 批量改文件名后缀名_PHP 批量修改文件后缀名
  11. 数据交互之封装request请求(微信小程序篇)
  12. 为编译安装的nginx提供init服务控制脚本
  13. Kali对网站进行DDOS攻击
  14. (一百三十七)梳理fragment的isAdded
  15. java 之动态生成类
  16. 程序员必备的11个Github优质项目
  17. 什么是服务器?服务器有哪几种类型?
  18. 广告业务系统 之 核心通道 —— “日志中心-s2s监测上报”
  19. MethodParameter
  20. 【Windows问题解决】 Win10无法打开Wlan,但是驱动正常的解决方案

热门文章

  1. CNN结构:MXNet设计和实现简介
  2. 使用VideoView做个实用的视频播放器
  3. linux常用命令汇总(pwd,echo,history,nano)
  4. 应用上下文webApplicationContext
  5. 3D数学读书笔记——矩阵进阶
  6. DBA基础系列SQL Server 2014:2. SQL Server用户数据库初始化配置
  7. WPF简单的口算案例
  8. 分析:合格的UTM设备评判与选择
  9. case class到底啥用
  10. No module named 'oscar.apps.promotions'