封裝Promise

class Mypromise {
        constructor(cb) {
            this.status = 'pending';
            this.data = null;
            this.resolveArr = [];
            this.rejecteArr = [];
            this.resolve = val => {
                if (this.status === 'pending') {
                    this.status = 'fulfilled';
                    this.data = val
                    this.resolveArr.forEach(cbs=> {
                    cbs();
                })
                }
            }
            this.reject = err => {
                if (this.status === 'pending') {
                    this.status = 'rejected';
                    this.data = err
                    this.rejecteArr.forEach(cbs => {
                    cbs();
                })
                }
            }
            cb(this.resolve, this.reject);
        }
        then(success, fail) {
            
            success = typeof success === 'function' ? success : function (val) { return val };
            fail = typeof fail === 'function' ? fail : function (val) { return val };
            // 得考慮三種狀態(tài)
            // 等待的狀態(tài)
            if (this.status === 'pending') {

                // 成功集合
                this.resolveArr.push(() => {
                    success(this.data);
                });

                // 失敗的集合
                this.rejecteArr.push(() => {
                    fail(this.data);
                });
            }

            // 成功的狀態(tài)
            if (this.status === 'fulfilled') {
                success(this.data);
            }

            // 失敗的狀態(tài)
            if (this.status === 'rejected') {
                fail(this.data);
            }
        }
        catch(fail){
            this.then(null, fail);
        }
    }
    // 自己的
    let mpro = new Mypromise(function (resolve, reject) {
        // 同步
        // resolve(1);
        // reject(0);

        // 異步
        setTimeout(() => {
            resolve(22222);
            // reject(-1);
        },1000);
    });

    mpro.then((data) => {
        console.log(data, '成功了');
    }, (err) => {
        console.log(err, '失敗了');
    });

    mpro.catch((err) => {
        console.log(err, 'err');
    });
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容