Promise.myAll = function(arr) {
let results = []
let current = null
let counter = 0
return new Promise((resolve,reject) => {
function processData(key, value) {
results[key] = value
if(++counter === arr.length) {
resolve(results)
}
}
for(let i = 0; i < arr.length; i ++) {
current = arr[i]
if(isPromise(current)) {
current.then(res= >{
processData(i, res)
},reject)
} else {
processData(i, current)
}
}
})
}
function isPromise(o) {
return !!o && (typeof o === ‘object’ || typeof o === ‘function’) && typeof o.then === ‘function’
}
测试:
let p1 = new Promise((resolve, rejcet) => {
resolve(1)
})
let p2 = new Promise((resolve, rejcet) => {
resolve(2)
})
Promise.myAll([p1, p2]).then( res => {
console.log(res)
})
// 输出应该是【1, 2】
注意:1.尽量别往Promise.prototype上面挂,因为构造函数的实力才可以访问到原型上,但Promise有时候用的是构造函数如:Promise.all([p1, p2])