手寫promise


class newPromise {
    constructor(fn) {
        this.state = "pending"
        this.value = null
        this.resolveCallbacks = []
        this.rejectCallbacks = []

        this.resolve = res => {
            if (this.state === "pending") {
                setTimeout(() => {
                    this.state = "resolved"
                    this.value = res
                    this.resolveCallbacks.map(cb => cb(this.value))
                }, 0)
            }
        }
        this.reject = err => {
            if (this.state === "pending") {
                setTimeout(() => {
                    this.state = "rejected"
                    this.value = err
                    this.rejectCallbacks.map(cb => cb(this.value))
                }, 0)
            }
        }

        try {
            fn(this.resolve, this.reject)
        } catch (err) {
            this.reject(err)
        }
    }

    then(onResolve, onReject) {
        console.log("調(diào)用then")
        var promise2 = new newPromise((res, rej) => {
            if (this.state === "pending") {
                this.resolveCallbacks.push(val => {
                    try {
                        let data = onResolve(val)
                        res(data)
                    } catch (e) {
                        rej(e)
                    }
                })
                this.rejectCallbacks.push(val => {
                    try {
                        let data = onReject(val)
                        res(data)
                    } catch (e) {
                        rej(e)
                    }
                })
            }

            if (this.state === "resolved") {
                try {
                    let data = onResolve(val)
                    res(data)
                } catch (e) {
                    rej(e)
                }
            }

            if (this.state === "rejected") {
                try {
                    let data = onReject(val)
                    res(data)
                } catch (e) {
                    rej(e)
                }
            }
        })
        return promise2
    }

    resolvePromise(promise2, x, resolve, reject) {}
}

newPromise.resolve = function(x) {
    return new newPromise((res, rej) => {
        return res(x)
    })
}

newPromise.reject = function(x) {
    return new newPromise((res, rej) => {
        return rej(x)
    })
}

newPromise.all = function(arr) {
    return new newPromise((res, rej) => {
        var result = []
        var step = 0
        for (let i = 0; i < arr.length; i++) {
            arr[i].then(val => {
                result[i] = val
                step++
                if (step === arr.length) {
                    res(result)
                }
            }, rej)
        }
    })
}

newPromise.race = function(arr){
    return new newPromise((res, rej) => {
        for(let i = 0; i < arr.length; i++){
            arr[i].then(val => {
                res(val)
            }, rej)
        }
    })
}

finally

Promise.prototype.finally = function (callback) {
  let P = this.constructor;
  return this.then(
    value  => P.resolve(callback()).then(() => value),
    reason => P.resolve(callback()).then(() => { throw reason })
  );
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摄悯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酱塔,更是在濱河造成了極大的恐慌粘昨,老刑警劉巖甩骏,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件香罐,死亡現(xiàn)場離奇詭異牛欢,居然都是意外死亡,警方通過查閱死者的電腦和手機惹恃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門夭谤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巫糙,你說我怎么就攤上這事朗儒。” “怎么了参淹?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵截珍,是天一觀的道長谍珊。 經(jīng)常有香客問我烹玉,道長受扳,這世上最難降的妖魔是什么事期? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任踩验,我火速辦了婚禮朵纷,結(jié)果婚禮上传趾,老公的妹妹穿的比我還像新娘。我一直安慰自己负蚊,他們只是感情好神妹,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著家妆,像睡著了一般鸵荠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伤极,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天蛹找,我揣著相機與錄音,去河邊找鬼哨坪。 笑死庸疾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的当编。 我是一名探鬼主播届慈,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忿偷!你這毒婦竟也來了金顿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鲤桥,失蹤者是張志新(化名)和其女友劉穎揍拆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茶凳,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡嫂拴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了慧妄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顷牌。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖塞淹,靈堂內(nèi)的尸體忽然破棺而出窟蓝,到底是詐尸還是另有隱情,我是刑警寧澤饱普,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布运挫,位于F島的核電站,受9級特大地震影響套耕,放射性物質(zhì)發(fā)生泄漏谁帕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一冯袍、第九天 我趴在偏房一處隱蔽的房頂上張望匈挖。 院中可真熱鬧碾牌,春花似錦、人聲如沸儡循。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽择膝。三九已至誓琼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肴捉,已是汗流浹背腹侣。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留齿穗,地道東北人傲隶。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像缤灵,于是被迫代替她去往敵國和親伦籍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容