不用说,肯定又是面试没写出来,我太fw了
思路
Promise.all 接收一个 Promise 实例的数组或具有 Iterator 接口的对象作为参数,这个方法返回一个新的 promise 对象
实现步骤:
- 首先我们能知道的是,Promise.all 返回一个Promise对象
- 定义一个counter计数传入的数组执行情况,resolve了就+1
- 定义一个result数组接收 resolve 传入的参数
- 循环遍历传入的数组,并用Promise.resolve( )包裹:
- 如果数组内不是promise对象,则也不会有影响,可以正常返回一个promise对象
- 如果数组内是promise对象,则链式调用,也不会有影响
- 传入数组参数所有回调成功才是成功,返回值数组与参数顺序一致
- 参数数组其中一个失败,则触发失败状态,第一个触发失败的 Promise 错误信息作为 Promise.all 的错误信息。
function promiseAll(promises) {return new Promise((resolve, reject) => {if (!Array.isArray(promises)) {throw new TypeError(`argument must be a array`)}let promiseNum = promises.lengthlet resolveCount = 0let resolveResult = []for (let i = 0; i < promiseNum; i++) {//promises[i] 可能是普通值,不是promise对象Promise.resolve(promises[i]).then(value => {resolveCount++resolveResult[i] = valueif (resolveCount === promiseNum) {return resolve(resolveResult)}}, error => {return reject(error)})}})}// testlet p1 = new Promise(function (resolve, reject) {setTimeout(function () {resolve(1)}, 1000)})let p2 = new Promise(function (resolve, reject) {setTimeout(function () {resolve(2)}, 2000)})let p3 = new Promise(function (resolve, reject) {setTimeout(function () {resolve(3)}, 3000)})promiseAll([p3, p1, p2]).then(res => {console.log(res) // [3, 1, 2]})
