Promise.all 的实现

153 阅读1分钟

promise.all功能

promise.all(iterable)返回一个新的 promise 实例,在 iterable 实例中,当所有的 promise 都是 fulfilled 时或者含有参数不包含 promise 时,状态会变成 fulfilled.如果参数中有一个变成 rejected ,此实例回调失败,失败原因是第一个 Promise 失败结果。

let p = promise.all(p1,p2,p3);

p 的状态由 p1,p2,p3 决定,分成以下情况

  1. 只有当 p1, p2, p3 都为 fulfilled 的时候,p 的状态才会为 fulfilled,此时 p1, p2, p3 的返回值组成一个数组,传递给 p 的回调。
  2. 只要 p1, p2, p3 中有一个被 rejected, p 的 状态就会变成 rejected, 此时第一个被rejected 的实例会的返回值,会传递给 p 的回调函数。

promise的特点

promise.all的返回值是一个 promise 实例
promise.all = function(prom){
	return new Promise((resolve, reject) => {
    	let index = 0;
        let result = [];
        if (prom.length === 0) {
        	resolve(result);
        } else {
        	function processValue(i, data){
            	result[i] = data;
                if (++index === prom.length) {
                	resolve(result);
                }
                for (let i = 0; i < prom.length; i++) {
                	Promise.resolve(prom[i]).then((data) => {
                    	processValue(i, data);
                    }, (err) => {
                    	reject(err);
                        return;
                    })
                }
                
            }
        }
    });
}