本次的任务

假如。。。。。

JavaScript v8 引擎发生了重大故障,Promise.all 方法变成了 undefined ,为了拯救 JavaScript 世界,需要开发一个模块来解决此问题。

使用者需要在代码入口处引入我们开发的模块就可渡过此劫,但要求三个月后官方修改此版本,代码无修改就能自动切换到官方版本。实现 Promise.all

首先要知道 Promise 是什么

promise 是对异步编程的一种抽象。它是一个代理对象,代表一个必须进行异步处理的函数返回的值或抛出的异常。

promise 最早是在 commonjs 社区提出来的,当时提出了很多规范。比较接受的是 promise/A 规范。后来人们在这个基础上。提出了 promise/A+规范,也就是实际上的业内推行的规范。ECMAScript 6.0 也是采用的这种规范。

英文版:https://promisesaplus.com/

中文版:【翻译】Promises/A+规范

上面的规范中主要定义的 then 的实现方式,也就是只规定了 Promise 的核心, Promise.racePromise.allapi 没有规定。

ECMAScript 6.0 Promise.all 规范

Node.js 兼容性如下图 点击查看在线版

特点

Promise 不需要编译器/解释器的支持

将来可能成为主流的 async-await,以及曾经火过一把的 generator + co,这些都是需要编译器或者解释器级别的支持才能使用。

Promise,是完全可以利用语言已有特性,作为一个库来实现!即使在非常原始的JS运行环境,你也可以自己实现一个 Promise,而不需要等待其他人的帮助。

Promise 是语言无关的

Promise 还是独立于语言的,如果你要给另外一种编程语言实现 Promise,只要照葫芦画瓢就行了。

promise 怎么用

请看这里,阮一峰的 ECMAScript 6 入门 Promise

实现 Promise.all

Promise.all 接收一个 promise 对象的数组作为参数,当这个数组里的所有 promise 对象全部变为resolve或 有 reject 状态出现的时候,它才会去调用 .then 方法,它们是并发执行的。

Promise.all 简介

Promise.all(promiseArray) 方法是 Promise 对象上的静态方法,该方法的作用是将多个 Promise 对象实例包装,生成并返回一个新的 Promise 实例。

参数:promiseArray,是一个 Promise 实例数组

var p1 = Promise.resolve(1),p2 = Promise.resolve(2),p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {console.log(results);  // [1, 2, 3]
});

在上面的方法中,promise 数组中所有的 promise 实例都变为resolve 的时候,该方法才会返回,并将所有结果传递 results 数组中。promise 数组中任何一个 promisereject 的话,则整个 Promise.all 调用会立即终止,并返回一个 reject 的新的 promise 对象。reject 使用示例如下:

var p1 = Promise.resolve(1),p2 = Promise.reject(2),p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {//then方法不会被执行console.log(results);
}).catch(function (e){//catch方法将会被执行,输出结果为:2console.log(2);
});

总结 promise.all 的特点

1、接收一个 Promise 实例的数组或具有 Iterator 接口的对象,

2、如果元素不是 Promise 对象,则使用 Promise.resolve 转成 Promise 对象

3、如果全部成功,状态变为 resolved,返回值将组成一个数组传给回调

4、只要有一个失败,状态就变为 rejected,返回值将直接传递给回调
all() 的返回值也是新的 Promise 对象

实现 Promise.all 方法

function promiseAll(promises) {return new Promise(function(resolve, reject) {if (!isArray(promises)) {return reject(new TypeError('arguments must be an array'));}var resolvedCounter = 0;var promiseNum = promises.length;var resolvedValues = new Array(promiseNum);for (var i = 0; i < promiseNum; i++) {(function(i) {Promise.resolve(promises[i]).then(function(value) {resolvedCounter++resolvedValues[i] = valueif (resolvedCounter == promiseNum) {return resolve(resolvedValues)}}, function(reason) {return reject(reason)})})(i)}})
}

npms 地址 promise-all-simple

参考

自己动手实现ES6 Promise

JavaScript Promise迷你书

Promise对象Promise.all()方法的使用

深入 Promise(一)——Promise 实现详解

深入理解 Promise (上)

扩展阅读

深入浅出js(Node.js)异步流程控制

实现 JavaScript 异步方法 Promise.all相关推荐

  1. JavaScript 的 Promise  和  C# 的 waitone 一样吗?请大家讨论i两句。

    JavaScript 的 Promise  和  C# 的 waitone 一样吗?请大家讨论i两句.

  2. JavaScript之Promise

    看完下面文章,你将了解到: 1.什么是Promise? 2.Promise怎样使用以及使用的场景,解决了什么问题 3.ES7较ES6又增加了哪些支撑Promise的语法糖 复制代码 一.Promise ...

  3. 你真的了解JavaScript的Promise吗?

    什么是Promise Promise代理了一个可能要在未来才能到达的值[[PromiseValue]].Promise的一个最重要的特点是,你可以通过then来指定当[[PromiseValue]]到 ...

  4. 小程序 异步方法 promise

    微信小程序里面接受数据为promise使用for循环 异步方法报错 问题描述 在js里面调用后台接口的方法能够成功访问并且也能获取数据,但是打印的时候打出来是promise或者为undefined 问 ...

  5. JavaScript之Promise实现

    ES2015提出了Promise,同时基于Promise的异步开发将开发者中回调地狱中解救出来.但在没有原生支持的环境下,需要借助Promise/A+之类的库来实现Promise,今天就来尝试自行实现 ...

  6. javascript的promise

    'use strict'; // ajax函数将返回Promise对象: function ajax(method, url, data) {var request = new XMLHttpRequ ...

  7. Javascript ES6 Promise同步读取文件(使用async、await)

    const fs=require('fs'); const path=require('path');const dirname='D:\\HBuilderX\\Workspace\\NodeJS\\ ...

  8. Javascript ES6 Promise异步链式读取文件解决回调地狱

    const fs=require('fs'); const path=require('path');const dirname='D:\\HBuilderX\\Workspace\\NodeJS\\ ...

  9. JavaScript:Promise进阶知识

    Promise Promise就是ES6新增的一个用于解决异步编程的方案.以前,我们在处理异步的时候,都是在回调函数内做处理的.比如Ajax请求,是在success属性里面做异步处理的,那么如果在一个 ...

最新文章

  1. jQuery日期选择器插件date-input
  2. 2亿简历遭泄漏,到底谁的锅?
  3. 审稿人眼中的好论文到底长什么样?
  4. 微机个人笔记-随机存取存储器(RAM)
  5. 机器学习-KMeans聚类 K值以及初始类簇中心点的选取
  6. Vert.x MySQLClient体验
  7. mysql忘记root密码安装_MySql忘记root密码的解决方法
  8. [16]manjaro安装nvidia驱动
  9. 舞台音效控制软件_QLab Pro 4.3.2 优秀的舞台音乐控制软件
  10. 视频封装格式篇(TS)
  11. 富爸爸穷爸爸--读书笔记
  12. 一只青蛙跳向三个台阶_青蛙跳台阶算法
  13. Phython学习—— 基础语法
  14. Java 中各种DTO,POJO 等的概念
  15. 企业如何选择电信、双线、多线/三线、BGP线路?他们的区别是什么?
  16. php导入excel 进度条,.NET_进度条在.net导入Excel时的应用实例,本文实例讲述了进度条在.net导 - phpStudy...
  17. 【OpenCV 例程200篇】205. 调节色彩平衡/饱和度/明度
  18. 计算机资源库在哪,电脑的资源管理在哪里
  19. 导入maven项目,报错Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:mav
  20. java官网以及java官网下载地址

热门文章

  1. VTK:Points之ExtractSurfaceDemo
  2. OpenGL text rendering文字渲染的实例
  3. OpenGL 距离场美化实例
  4. c++operators(运算符)
  5. C++对C的加强之三目运算符功能增强
  6. C++static关键字
  7. linux spi屏驱动程序,65 linux spi设备驱动之spi LCD屏驱动
  8. 如何实现把固定内容自动写入excel_Excel如何把修改记录自动写入批注?
  9. 玩转NumPy——split()函数使用详解
  10. matlab基本矩阵运算,科学网—matlab中矩阵基本运算 - 成爱芳的博文