手动实现Promise.all
原创
©著作权归作者所有:来自51CTO博客作者wx63fc582aa165f的原创作品,请联系作者获取转载授权,否则将追究法律责任
想要实现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对象