手写Promise.all

126 阅读1分钟

思路

  • 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 => {
        	// 保存这个promise实例的value
					resolvedValue[count++] = data
          // 通过计数器,标记是否所有实例均 fulfilled
          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);
});