想要实现Promise.all()功能,关键点


/* * 1、接受一个数组作为参数,或者具有 Iterator 接口的参数 * 2、参数支持Promise对象和普通的对象,如果不是Promise对象就会调用Promise.resolve,将参数转为Promise实例 * 3、返回一个Promise对象,且返回的每个成员都是Promise实例 * 4、只有全部成功才算成功 * * */ 


Promise.all1 = function (promises) {
return new Promise(function (resolve, reject) {
let resolvedCounter = 0
let promiseNum = promises.length
let resolvedValues = new Array(promiseNum)
for (let i = 0; i < promiseNum; i++) {
Promise.resolve(promises[i]).then(function (value) {
resolvedCounter++
resolvedValues[i] = value
if (resolvedCounter === promiseNum) {
return resolve(resolvedValues)
}
}, function (reason) {
return reject(reason)
})
}
})
}

知识点补充:

Promise.resolve(),将现有对象转为Promise对象,该方法的参数分成四种情况

1、参数是一个Promise实例,这种情况,Promise.resolve将不做任何修改,原封不动地返回这个实例

2、参数是一个thenable对象,(thenable对象是指具有then方法的对象),Promise.resolve()方法会将这个对象转为Promise对象,然后执行then()方法

3、如果不是具有then()方法的对象,则Promise.resolve()方法返回一个新的Promise对象,状态为resolved

4、也可以不带参数,直接返回一个resolved状态的Promise对象