手寫Promise

MDN文檔

    const PENDING = 'pending'//初始化
    const RESOLVED = 'resolved'//完成
    const REJECTED = 'rejected'//失敗
/*一個 Promise有以下幾種狀態(tài):
pending: 初始狀態(tài)嫡秕,既不是成功厢洞,也不是失敗狀態(tài)爱只。
fulfilled: 意味著操作成功完成邓梅。
rejected: 意味著操作失敗。*/
function Promise(excutor) {
/*executor是一個帶有resolve冲杀,
reject兩個參數(shù)的函數(shù)公罕,
Promise構(gòu)造函數(shù)執(zhí)行
時立即調(diào)用executor 函數(shù)*/
    const self = this
    self.status = PENDING
    self.data = undefined
    self.callbacks = []
    function resolve(value) {
        if(self.status!==PENDING) {
            return
        }
        self.status = RESOLVED
        self.data = value
        if(self.callbacks.length>0){
           setTimeout(()=>{
               self.callbacks.forEach(item=>{
                   item.onResolved(value)
               })
           })

        }
    }
    function reject(reason){
        if(self.status!==PENDING) {
            return
        }
        self.status = REJECTED
        self.data = reason
        if(self.callbacks.length>0){
            setTimeout(()=>{
                self.callbacks.forEach(item=>{
                    item.onRejected(reason)
                })
            })
        }
    }
    try{
        excutor(resolve,reject)
    }catch (err) {
        reject(err)
    }
}
Promise.prototype.then = function(onResolved,onRejected){
    onResolved = typeof onResolved === 'function'?onResolved:value => value
    onRejected = typeof onRejected === 'function'?onRejected:reason => {throw reason}
/*判斷傳過來的是否是function棺聊,如果不是那就說明有結(jié)果了*/
    const self = this
    return new Promise((resolve,reject)=>{
        function handle(callback) {
            try{
/*執(zhí)行失敗或成功的回調(diào),
獲取值如果是promise對象那么繼續(xù)執(zhí)行then方法淹接,
如果有結(jié)果則resolve結(jié)果修改data十性,返回resolved狀態(tài)的promise,拋出錯誤
那么 then 返回的 Promise 也會成為rejected的promise*/
                const  result = callback(self.data)
                if(result instanceof Promise){
                    result.then(resolve, reject)
                }else{
                    resolve(result)
                }

            }catch (err) {
                reject(err)
            }
        }

        if(self.status===PENDING){
            self.callbacks.push({
                onResolved(){
                    handle(onResolved)

                },
                onRejected(){
                    handle(onRejected)
                }
            })
        }else if(self.status===RESOLVED){
            setTimeout(()=>{
                handle(onResolved)
            })
        }else{
            setTimeout(()=>{
               handle(onRejected)
            })
        }
})
}
Promise.prototype.catch = function(onRejected){
      return this.then(undefined,onRejected)
}
Promise.resolve = function (value) {
/*
返回一個狀態(tài)由給定value決定的Promise對象塑悼。
如果該值是thenable(即劲适,帶有then方法的對象),
返回的Promise對象的最終狀態(tài)由then方法執(zhí)行決定拢肆;
否則的話(該value為空减响,基本類型或者不帶then方法的對象),
返回的Promise對象狀態(tài)為fulfilled,并且將該value傳遞給對應(yīng)的then方法郭怪。
*/
    return new Promise((resolve,reject)=>{
        if(value instanceof Promise){
            value.then(resolve,reject)
        }else{
            resolve(value)
        }

    })
}
Promise.reject = function (reason) {
/*返回一個狀態(tài)為失敗的Promise對象支示,并將給定的失敗信息傳遞給對應(yīng)的處理方法*/
    return new Promise((resolve,reject)=>{
        reject(reason)
    })
}
Promise.all = function (promises) {
/*傳一個promise數(shù)組
返回一個promise讀對象,如果成功傳進(jìn)來的promises數(shù)組的執(zhí)行結(jié)果按傳進(jìn)
來的順序放在數(shù)組里鄙才,如果失敗就傳第一個失敗的原因
*/
    return new Promise((resolve,reject)=>{
        let flags = new Array(promises.length)
        let count = 0
        promises.forEach(
            (item,index)=>{
                item.then(
                    value => {
                        flags[index] = value
                        count++
                        if(count===promises.length){
                            resolve(flags)
                        }
                    },
                    reason => {
                        reject(reason)
                    }
                )
            }
        )
    })
}
Promise.race = function (promises) {
    return new Promise((resolve,reject)=>{
/*
將第一個promise的結(jié)果進(jìn)行返回
*/
        promises.forEach(
            (item,index)=>{
                item.then(
                    value => {
                      resolve(value)
                    },
                    reason => {
                        reject(reason)
                    }
                )
            }
        )
    })
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颂鸿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子攒庵,更是在濱河造成了極大的恐慌嘴纺,老刑警劉巖败晴,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栽渴,居然都是意外死亡尖坤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門闲擦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慢味,“玉大人,你說我怎么就攤上這事墅冷〈柯罚” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵寞忿,是天一觀的道長驰唬。 經(jīng)常有香客問我,道長腔彰,這世上最難降的妖魔是什么叫编? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮萍桌,結(jié)果婚禮上宵溅,老公的妹妹穿的比我還像新娘。我一直安慰自己上炎,他們只是感情好恃逻,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藕施,像睡著了一般寇损。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裳食,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天矛市,我揣著相機與錄音,去河邊找鬼诲祸。 笑死浊吏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的救氯。 我是一名探鬼主播找田,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼着憨!你這毒婦竟也來了墩衙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漆改,沒想到半個月后心铃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡挫剑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年去扣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暮顺。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡厅篓,死狀恐怖秀存,靈堂內(nèi)的尸體忽然破棺而出捶码,到底是詐尸還是另有隱情,我是刑警寧澤或链,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布惫恼,位于F島的核電站,受9級特大地震影響澳盐,放射性物質(zhì)發(fā)生泄漏祈纯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一叼耙、第九天 我趴在偏房一處隱蔽的房頂上張望腕窥。 院中可真熱鬧,春花似錦筛婉、人聲如沸簇爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽入蛆。三九已至,卻和暖如春硕勿,著一層夾襖步出監(jiān)牢的瞬間哨毁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工源武, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扼褪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓粱栖,卻偏偏與公主長得像话浇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子查排,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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