1.Promise.Race()
Promise._race = function(promiseList = []) {
return new Promise((resolve, reject) => {
let i = 0;
for (var p of promiseList) {
p.then(res => {
if (i < 1) {
i ++;
}
}).catch(err => {
if(i < 1) {
reject(err)
i ++;
}
})
}
})
}
var p1 = new Promise((rsv,tjc) => {
setTimeout(rsv, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,tjc) => {
setTimeout(tjc, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,tjc) => {
setTimeout(tjc, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,tjc) => {
setTimeout(rsv, Math.random() * 200, 'p4');
})
Promise._race([p1,p2,p3,p4]).then(res => {
console.log('res=',res)
}).catch(err => {
console.log('err=',err)
}).finally(f => {
console.log('finally')
})
2.Promise.any()
Promise._any = function(promiseList){
let i = 0, j = 0;
return new Promise((resolve,reject) => {
for(var p of promiseList){
p.then(res => {
if (j <1){
resolve(res);
}
i ++;
j ++;
}).catch(err => {
if (i >= promiseList.length -1){
reject('AggregateError: No Promise in Promise.any was resolved')
}
i ++;
})
}
})
}
var p1 = new Promise((rsv,rjc) => {
setTimeout(rjc, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,rjc) => {
setTimeout(rjc, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,rjc) => {
setTimeout(rjc, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,rjc) => {
setTimeout(rjc, Math.random() * 200, 'p4');
})
Promise._any([p1,p2,p3,p4]).then(res => {
console.log('res=',res)
}).catch(err => {
console.log('err=',err)
})
3.Promise.all()
Promise._all = function(promiseList){
return new Promise((resolve, reject) => {
var ret = [], i = 0, j = 0;
ret.length = promiseList.length;
for(let index in promiseList){
promiseList[index].then(res => {
ret[index] = res;
i ++;
if (i === promiseList.length)(
resolve(ret)
)
}).catch(err => {
if (j < 1) {
reject(err)
}
j ++;
})
}
})
}
var p1 = new Promise((rsv,rjc) => {
setTimeout(rsv, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,rjc) => {
setTimeout(rsv, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,rjc) => {
setTimeout(rsv, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,rjc) => {
setTimeout(rsv, Math.random() * 200, 'p4');
})
Promise._all([p1,p2,p3,p4]).then(res => {
console.log('res=',res)
}).catch(err => {
console.log('err=',err)
})
4.romise.allSettled()
Promise._allSettled = function(promiseList){
return new Promise((resolve, reject) => {
var ret = [], count = 0;
ret.length = promiseList.length;
for(let i in promiseList){
promiseList[i].then(res => {
ret[i] = { status: 'fulfilled', value: res };
count ++;
if (count === promiseList.length){
resolve(ret);
}
}).catch(err =>{
ret[i] = { status: 'rejected', value: err };
count ++;
if (count === promiseList.length){
reject(ret);
}
})
}
})
}
var p1 = new Promise((rsv,rjc) => {
setTimeout(rsv, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,rjc) => {
setTimeout(rsv, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,rjc) => {
setTimeout(rjc, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,rjc) => {
setTimeout(rjc, Math.random() * 200, 'p4');
})
Promise._allSettled([p1,p2,p3,p4]).then(res => {
console.log('res=',res)
}).catch(err => {
console.log('err=',err)
})