咱们书接上文( 点我查看 ),继续咱们的手写 Promise
:
# 第五步:Promise .all() / race() 的实现
/**
* @func Promise 函数对象的 all()
* @param promises 请求数组
* @returns 返回一个 Promise
* @returns 只有 Promise 都成功时才成功,只要有一个失败就失败,并返回失败的 Promise
*/
Promise.all = function(promises){
// 用来保存所有成功value的数组
const values = new Array(promises.length);
// 用来保存成功Promise的数量
let resolvedCount = 0;
// 返回一个新的Promise
return new Promise((resolve, reject)=>{
// 遍历 promises 获取每个 Promise 的结果
promises.forEach((p,index)=>{
Promise.resolve(p).then(
value => {
resolvedCount++
// 将成功的 value 保存至 values
values[index] = value;
// 如果全部成功,return 的 Promise 的状态为成功
if(resolvedCount == promises.length){
resolve(values)
}
},
reason =>{
// 只要有一个失败了,return 的 Promise 就是失败
reject(reason);
}
)
})
})
}
/**
* @func Promise 函数对象的 race()
* @param promises 请求数组
* @returns 返回一个 Promise,其结果由第一个完成的 Promise 决定
*/
Promise.race = function(promises){
// 返回一个新的 Promise
return new Promise((resolve, reject)=>{
// 遍历 promises 取出每个 Promsie 的结果
promises.forEach(p => {
Promise.resolve(p).then(
value => {
// 一旦有一个成功了, return 的 Promise 就成功
resolve(value);
},
reason =>{
// 一旦有一个失败了, return 的 Promise 就失败
reject(reason);
}
)
})
})
}
测试demo
方法 all():
const p1 = Promise.resolve(Promise.resolve(1));
const p2 = Promise.resolve(2);
const p3 = Promise.resolve(3);
Promise.all([p1,p2,p3]).then(
value=>{
console.log(value)
},
reason => {
console.log(reason)
}
);
输出为 [1,2,3]
方法 race():
const p1 = Promise.resolve(Promise.resolve(1));
const p2 = Promise.resolve(2);
const p3 = Promise.reject(3);
Promise.race([p1,p2,p3]).then(
value=>{
console.log(value)
},
reason => {
console.log(reason)
}
);
输出为 2
哇哦,又又又简单实现了一小步,我们不骄傲,继续努力~~~
网友评论