封裝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');
    });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 加載圖片,用promise resolve(img) 有兩個(gè)作用, 一個(gè)是 改變狀態(tài),聲明狀態(tài)另一個(gè)是將返回值傳遞...
    wudimingwo閱讀 602評(píng)論 0 0
  • 丁老師學(xué)習(xí)名言你用你會(huì)的知識(shí)去解釋他, => 解釋通了, 你就明白了=> 解釋不通, 該學(xué)習(xí)了!! 繼續(xù).. ...
    wudimingwo閱讀 282評(píng)論 0 0
  • 參考資源:【翻譯】Promises/A+規(guī)范-圖靈社區(qū) BAT前端經(jīng)典面試問題:史上最最最詳細(xì)的手寫Promise...
    CondorHero閱讀 3,152評(píng)論 0 4
  • 簡(jiǎn)單的總結(jié),希望對(duì)大家有所幫助,如有不對(duì)的地方也煩請(qǐng)指出,謝謝!
    代碼敲不完閱讀 224評(píng)論 0 0
  • 1.自定義一個(gè)方法,如:Ajax,此處我傳了2個(gè)參數(shù) 2.在使用的時(shí)候
    leesession閱讀 722評(píng)論 0 2

友情鏈接更多精彩內(nèi)容