Promsie.all用法
实现一个方法首先要理解此方法的用法,Promise.all是es6中的一个方法,接收一个包含一组实例为Promise的数组作为参数,然后返回一个Promise对象。具体请看阮一峰的es6的相关知识。
const p = Promise.all([p1, p2, p3]);
注意p1,p2,p3都为Promise对象
(1)只有p1
、p2
、p3
的状态都变成fulfilled
,p
的状态才会变成fulfilled
,此时p1
、p2
、p3
的返回值组成一个数组,传递给p
的回调函数。
(2)只要p1
、p2
、p3
之中有一个被rejected
,p
的状态就变成rejected
,此时第一个被reject
的实例的返回值,会传递给p
的回调函数。
具体实现
function promiseAll(arr) {
let resultArr = [];
return new Promise((resolve, reject) => {
let i = 0;
next();
function next() {
if (i < arr.length) {
arr[i].then((value) => {
resultArr.push(value);
i++;
next();
})
} else {
resolve(resultArr);
}
}
})
}
var promise = new Promise((resolve, reject) => {
setTimeout(resolve(1), 100);
});
var promise1 = new Promise((resolve, reject) => {
setTimeout(resolve(2), 100);
});
var promiseArr = [promise, promise1];
var test = promiseAll(promiseArr);
test.then(value => console.log(value));//[1,2]
此实现思路就是对next函数进行递归调用,只有执行完一个Promise才会执行下一个,然后用计数器和数组长度进行比较,完成后返回一个带有value的promise,这只是一个简单版的实现,当然还有部分功能没有实现,就当做同学们的一个思考版吧