promise静态方法手动实现

69 阅读1分钟

实现一个race方法

class MyPromise{
    static race(arr){
        return new Promise((resolve,reject)=>{
            arr.forEach(item=>{
                // item.then(res=>{
                //     resolve(res);
                // },err=>{
                //     reject(err);
                // })
                item.then(resolve,reject); // 简写 ;
            })
        })
    }
}
let p1 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(1111);
    }, 2000);
})

let p2 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(222);
    }, 3000);
})

let p3 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        // resolve(333);
        reject("错了");
    }, 1000);
})

MyPromise.race([p1,p2,p3]).then(res=>{
    console.log("成功",res)
},err=>{
    console.log("失败",err);
})

all方法的实现

let  p1 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(111);
    }, 1000);
})

let  p2 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(222);
    }, 3000);
})

let  p3 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(333);
        // reject("error");
    }, 2000);
})

class MyPromise{
    static all(arr){
        return new Promise((resolve,reject)=>{
            var resarr = [];
            var count = 0;
            arr.forEach(item=>{
                item.then(res=>{
                    count++;
                    resarr.push(res);
                    // console.log(count);
                    // resolve(resarr);
                    if(count===arr.length){
                        resolve(resarr);
                    }
                },err=>{
                    reject(err);
                })
            })
        })
    }
}

MyPromise.all([p1,p2,p3]).then(res=>{
    console.log(res)
},err=>{
    console.log(err);
})

promise里的allsettled实现

let  p1 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(111);
    }, 1000);
})


let  p2 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(222);
    }, 3000);
})

let  p3 = new Promise((resolve,reject)=>{
    setTimeout(() => {
        resolve(333);
    }, 2000);
})

class MyPromise{
    static allSettled(arr){
        return new Promise(resolve=>{
            var resarr = [];
            var count = 0;
            arr.forEach(item=>{
                item.then(res=>{
                    count++;
                    let obj = {
                        status:"fufilled",
                        value:res
                    }
                    resarr.push(obj);
                    if(count===arr.length){
                        resolve(resarr);
                    }

                },err=>{
                    count++;
                    let obj = {
                        status:"rejected",
                        reason:err
                    }
                    resarr.push(obj);
                    if(count===arr.length){
                        resolve(resarr);
                    }
                })
            })
        })
    }
}

MyPromise.allSettled([p1,p2,p3]).then(res=>{
    console.log(res);
})