思路
- Promise.all返回的一定是一个Promise,所以首先就是return new Promise();
- 遍历传入的参数,用Promise,resolve()将其包裹起来,使其成为Promise;
- 最重要的就是什么时候决议,也就是何时resolve出来,在这里做了计数器(count),每个内部promise对象决议后就将计数器+1,并判断+1后的大小是否与传入的对象的数量相等,如果相等则调用resolve(),如果任何一个promise对象失败了,则调用reject()方法。
- 官方规定的promise.all方法接受的是一个可遍历的参数,并不一定是数组,所以用Array.from()转化一下
- 用ffor of进行遍历,因为可遍历的数组,肯定有iterator方法,便可以使用for of进行遍历
代码
Promise.myAll = function(iterators) {
const promises = Array.from(iterators)
const num = promises.length
let count = 0
let resolvedValue = new Array(num)
return new Promise((resolve, reject) => {
for(let item of promises){
Promise.resolve(item)
.then(data => {
resolvedValue[count++] = data
if(count === num){
resolve(resolvedValue)
}
})
.catch(err => reject(err))
}
})
}
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.myAll([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});