Promise.all()方法

选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。

到目前为止,前几章节每个示例都是一次响应一个Promise。但是,有时,需要监控多个 Promise 的进度以确定下一步操作。JavaScript 提供了几种方法来监控多个 Promise,然后用不同的方式响应它们。本章讨论的所有方法都允许并行执行多个 Promise,然后作为一个组而不是用单独一个值响应。

Promise.all()方法

Promise.all() 方法接受单个参数,该参数是要监控的一组可迭代的promise(例如数组),返回仅当可迭代中的每个promise都resolved的promise。当可迭代对象中的每个 Promise 都实现时,返回的 Promise 就settled了,如下所示:

let promise1 = Promise.resolve(42);

let promise2 = new Promise((resolve, reject) => {
  resolve(43);
});

let promise3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(44);
  }, 100);
});

let promise4 = Promise.all([promise1, promise2, promise3]);

promise4.then(value => {
  console.log(Array.isArray(value)); // true
  console.log(value[0]); // 42
  console.log(value[1]); // 43
  console.log(value[2]); // 44
});
let promise1 = Promise.resolve(42);

let promise2 = new Promise((resolve, reject) => {
  resolve(43);
});

let promise3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(44);
  }, 100);
});

let promise4 = Promise.all([promise1, promise2, promise3]);

promise4.then(value => {
  console.log(Array.isArray(value)); // true
  console.log(value[0]); // 42
  console.log(value[1]); // 43
  console.log(value[2]); // 44
});

这里的每个promise都用一个数字来resolve。 对 Promise.all() 的调用创建了新的Promise,即Promise4,当Promise1、Promise2 和 Promise3 fulfilled,它最终fulfilled。 传递给 promise4 的实现处理程序的结果是一个包含每个解析值的数组:42,43和44。这些值按照 promise 传递给 Promise.all() 的顺序存储,因此您可以将 promise 结果与solved promise匹配。

如果任何传递给 Promise.all() 的 Promise rejected,返回的 Promise 会立即rejected,而无需等待其他 Promise完成。

let promise1 = Promise.resolve(42);

let promise2 = Promise.reject(43);

let promise3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(44);
  }, 100);
});

let promise4 = Promise.all([promise1, promise2, promise3]);

promise4.catch(reason => {
  console.log(Array.isArray(reason)); // false
  console.log(reason); // 43
});

在这个例子中,第二个 promise (promise2) rejected,值为 43。promise4 的rejection handler被立即调用,而无需等待第一个 promise (promise1) 或第三个 promise(promise3) 完成执行。 (他们仍然完成执行;promise4 只是不等待。)

rejection handler总是接收单个值而不是数组,并且该值是来自rejected 的 Promise 的拒绝值。 在这种情况下,rejection handler 接收43以反映来自 promise2的rejection。

可迭代参数中的任何非promise值都将传递给 Promise.resolve() 以将其转换为promise

 

版权声明:著作权归作者所有。

相关推荐

检测iPhone X机型的方法

iPhone X即将上市。为了更好适配iPhone X,我们可能需要对iPhone做机型的判断。下面介绍两种方法:根据屏幕尺寸和方向判断这是iPhone机型列表。Swift 3if UIDevice().userInterfaceIdiom == .phone {      &n

Python安全创建目录的方法

在介绍Python安全创建目录之前,先举一个不安全创建目录的方式:if not os.path.exists(directory):     os.makedirs(directory) 在例子里,先判断目录是否存在,然后创建目录。这种方式是不安全的,它会导致竞争条件。在os.path.exists()和os.makedirs()之间的时

Swift 3/4缩放UIImage的方法

给UIImage添加extension(兼容Swift3 和Swift 4)extension UIImage {     func scaled(withSize size: CGSize) -> UIImage {   &nbs

Python比较字典的巧妙方法

Python里比较两个字典,可以比较两个字典有多少个是相同的键值对的。示例:>>> x = dict(a=1, b=6,c=3) >>> y = dict(a=2, b=2) >>> shared_items = set(x.items

Spring MVC获取请求header的方法

在Spring MVC有两种方法可以用来获取请求头Header的值。方法一、通过在方法的参数添加注解@RequestHeader示例如下:@Controllerpublic class RequestHeaderDemoController { @Autowired private HttpServletRequest request; @GetMapping("/prin

Ubuntu禁用systemd-resolved的方法

1、禁用并停止systemd-resolved的服务:sudo systemctl disable systemd-resolved.servicesudo systemctl stop systemd-resolved2、在/etc/NetworkManager/NetworkManager.conf文件的[main]中添加下面一行:dns=default3、删除链接:/etc/resolv.c

Python3 词典按值排序的方法

Python 3.6按值排序:x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}按键排序只需要把item[1]改为item[0]x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}{

CKEditor5正确添加插件的方法

CKEditor5添加插件错误ckeditor-duplicated-modules本来想在CKEditor 5的ckeditor5-build-classic添加一个Code Block插件,按官方文档,先安装@ckeditor/ckeditor5-code-blocknpm install --save @ckeditor/ckeditor5-code-block然后再代码中引入使用:impo

CKEditor5 Observable——装饰方法

上一节我们学习了在CK5中,如何绑定多个属性以及绑定多个Observable对象,今天我们学习如何装饰方法。 首先,我们提出一个问题,为什么会有装饰方法呢?以及什么叫做装饰?所谓装饰,就是在不改变原来方法功能的前提下,增加方法的功能,众所周知在java的IO流中,就有很多地方用到了装饰。 而在CK5中,装饰是什么意思呢?请看下面这段话:Decorating object met