Promise-06 catch、all、race、resolv

2020-09-16  本文已影响0人  呆桃冲鸭冲鸭
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>my</title>
</head>
<body>
    <p>test my</p>
</body>
<script type="module">
    //  type="module" 严格模式 
    import MyPromise from './promise.js';
  
    // 三种状态 1.pending 2.fulfilled 3.rejected
    let myP = new MyPromise((resolve,reject)=>{
        resolve("suc...");
        // reject("err...");
    });
    //微任务
    // myP.then(res=>{
    //     console.log("Promise=====222");
    // },err=>{
    //     console.log(err);
    // });
    // then链式调用 三种返还值(不返还、返还普通的字符串或数字、返还promise对象)最终返还promise对象
    // let p = myP.then(res=>{
    //     console.log(res)
    //     // return 111;
    //     return new MyPromise((resolve,reject)=>{
    //         resolve("222...");
    //     });
    // });
    // p.then(res=>{
    //     console.log(res)
    // })

    // 相关方法 catch all race
    myP.then(res=>{
        console.log("res===");
    }).catch(err=>{
        console.log(err,'err===')
    });

    let p1 = new MyPromise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("suc...1");
        },1000);
    });
    let p2 = new MyPromise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("suc...2");
        },2000);
    });
    Promise.all([p1,p2]).then(res=>{
        console.log(res)
    });
    Promise.race([p1,p2]).then(res=>{
        console.log(res)
    });
    let p3 = Promise.resolve(123);
    console.log(p3)
    let p4 = Promise.reject(1234);
    console.log(p4)

</script>
</html>
export default class MyPromise{
    constructor(handle){
        this.state = "pending";
        this.result = undefined;
        this.resolveFnArr = [];
        this.rejectFnArr = [];
        handle(this._resolve.bind(this),this._reject.bind(this));
    };
    _resolve(val){
        this.state = "fulfilled";
        this.result = val;
        // 执行then的回调 变成微任务执行
        const run = () => {
            let cb;
            while(cb = this.resolveFnArr.shift()){
                cb && cb(val);
            };
        };
        const observer = new MutationObserver(run);
        observer.observe(document.body,{attributes: true});
        document.body.setAttribute("my",Math.random());
    };
    _reject(val){
        this.state = "rejected";
        this.result = val;
        // 执行then的回调 变成微任务执行
        const run = () => {
            let cb;
            while(cb = this.rejectFnArr.shift()){
                cb && cb(val);
            };
        };
        const observer = new MutationObserver(run);
        observer.observe(document.body,{attributes: true});
        document.body.setAttribute("my",Math.random());
    };
    then(onResolved,onRejected){
        // 异步onResolved,onRejected不会立即执行;是在调取_resolve、_reject再执行
        // 保存onResolved、onRejected
        return new MyPromise((resolve,reject)=>{
            let resolveFn = val => {
                let res = onResolved && onResolved(val);
                //判断是否是MyPromise对象
                if(res instanceof MyPromise){
                    // return res.then((res)=>{
                    //     resolve(res)
                    // })
                    return res.then(resolve)
                }
                resolve(res);
            };
            let rejectedFn = val => {
                onRejected && onRejected(val);
                reject(val);
            };
            this.resolveFnArr.push(resolveFn)
            this.rejectFnArr.push(rejectedFn)
        });
    };
    catch(cb){
        return this.then(undefined,cb)
    };
    static all(lists){
        return new MyPromise((resolve)=>{
            let arr = [];
            let num = 0;
            lists.forEach(item => {
                item.then(res=>{
                    arr.push(res);
                    num ++;
                    if(num===lists.length){
                        resolve()
                    };
                });
            });
        });
    }
    static race(lists){
        return new MyPromise((resolve,reject)=>{
            lists.forEach(item => {
                item.then(res=>{
                    resolve(res);
                },err=>{
                    reject(err);
                });
            });
        });
    }
    static resolve(val){
        return new MyPromise((resolve)=>{
            resolve(val)
        });
    }
    static reject(val){
        return new MyPromise((undefined,reject)=>{
            reject(val)
        });
    }
}
上一篇下一篇

猜你喜欢

热点阅读