Promise.all()和Promise.race()是Promise中两个非常有意思的API。在实现并发控制上有着重要的作用(https://github.com/rxaviers/async-pool)。以下就Promise.all()和Promise.race()的实现做简单记录。
Promise.all(iterable)会返回一个promise对象,当输入的所有promise对象的状态都变成resolved,返回的promise对象就会以数组的形式,返回每个promise对象resolve之后的结果。当输入的任何一个promise的状态变为rejected时,则返回的promise对象就会reject对应的错误信息。
实现:
Promise.all = function (iterators) {
// 返回的是一个promise对象
return new Promise((resolve, reject) => {
if (!iterators || iterators.length === 0) {
return resolve([])
} else {
let count = 0; //计数器,用于判断所有任务是否已经执行完成
let result = []; //结果数组
for(let i = 0; i < iterators.length; i++){
// 考虑到iterators[i]可能是个普通对象,所以统一包装成Promise对象
Promise.resolve(iterators[i]).then(
data => {
result[i] = data;
// 当所有任务都执行完成后,再统一返回结果
if(++count === iterators.length){
resolve(result);
}
},
// 某一个状态出错了,就调用reject方法
err => {
reject(err);
return;
}
)
}
}
})
}
Promise.race()也会返回一个promise对象,一旦迭代器中的某个promise对象resolved或rejected,返回的promise对象就会resolve或reject相应的值。
实现:
Promise.race = function (iterators) {
return new Promise((resolve, reject) => {
for (const iter of iterators) {
Promise.resolve(iter).then(
res => {
resolve(res)
},
err => {
reject(err);
}
)
}
})
}