参考文章
Promise.all是挂载到Promise类实例上
返回的是一个Promise
需要遍历入参数组中的每一项,判断传入的是不是promise,如果是promise则执行then方法,然后将then方法中的成功回调的data返回,失败则reject
如果入参数组中有基本数值,则直接返回
通过计数器,来判断函数的执行结果
function myPromiseAll(arr) { // 参数是一个iterable对象,一般是数组
// 返回一个Promise实例
return new Promise((resolve, reject) => {
var index = 0
var result = []
function newData(i,data){
result[i] = data
if(++index === arr.length){
resolve(result)
}
}
if (arr.lenght == 0) {
resolve()
} else {
for(let i = 0; i < arr.length ; i++){
if(arr[i].then){
arr[i].then(data=>{
newData(i,data)
},(err)=>{
reject(err)
console.log(arr);
// 输出传入的数组中每一个 promise 执行后的状态和值
return
})
} else {
newData(i,arr[i])
}
}
}
});
}
let p1 = new Promise((resolve, reject)=> {
setTimeout(resolve, 2000, "P1 resolved");
})
let p2 = new Promise((resolve, reject)=> {
setTimeout(reject, 3000, "P2 resolved");
})
let p3 = new Promise((resolve, reject)=> {
setTimeout(resolve, 4000, "P3 resolved");
})
let pResult = myPromiseAll([p1,p2,p3]);
pResult.then(value=>{
console.log(pResult);
console.log(value);
},err=> {
console.log(pResult);
console.log(err);
})
//[
// Promise { 'P1 resolved' },
// Promise { <rejected> 'P2 resolved' },
// Promise { <pending> }
//]
//Promise { <rejected> 'P2 resolved' }
//P2 resolved
promise.race()
Promise.race 就像他的名字一样"竞赛",取跑得最快的那个 Promise,成功就 resolve,失败就 reject。
所以直接在循环的每个 Promise里的 then 和 catch 里取 resolve 或者 reject,去触发最外层的 Promise。
function myPromiseRace(arr){
return new Promise((resolve,reject)=>{
arr.forEach(p=>{
Promise.resolve(p).then(data=>{
resolve(data)
},err=>{
reject(err)
})
})
})
}
let p1 = new Promise((resolve, reject)=> {
setTimeout(resolve, 2000, "P1 resolved");
})
let p2 = new Promise((resolve, reject)=> {
setTimeout(resolve, 1000, "P3 resolved");
})
let pResult = myPromiseRace([p1,p2]);
pResult.then(value=>{
console.log(pResult);
console.log(value);
},err=> {
console.log(pResult);
console.log(err);
})