Promise

1Promise承諾(期約)

什么是Promise:Promis是異步編程的一種解決方案屋确,簡(jiǎn)單來(lái)說(shuō)Promise就是一個(gè)容器保存著一個(gè)未來(lái)才會(huì)結(jié)束的事件(一般是異步操作)的結(jié)果。

1.1特點(diǎn)

1躲因、對(duì)象的狀態(tài)不受外界影響。
2乐尊、一旦狀態(tài)改變悬秉,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果南缓。

1.2狀態(tài)

Promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):

pending(進(jìn)行中)荧呐、resolved(已成功)和rejected(已失敽盒巍)纸镊。

只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài)获雕,任何其他操作都無(wú)法改變這個(gè)狀態(tài)薄腻。

1.3缺點(diǎn)

1收捣、無(wú)法取消Promise届案,一旦新建它就會(huì)立即執(zhí)行,無(wú)法中途取消罢艾。
2楣颠、如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤咐蚯,不會(huì)反應(yīng)到外部童漩。
舉個(gè)例子:

        let promise1 = new Promise((res, rej) => {
            rej('11');
        }).catch(err => {
            console.log('err1', err);//err1  11
        })
        let promise2 = new Promise((res, rej) => {
            rej('11');
        }).then(null, err => {
            console.log('err2', err);//err2  11
        })
        let promise3 = new Promise((res, rej) => {
            rej('11');
        })//報(bào)錯(cuò),Uncaught (in promise) 11

3、當(dāng)處于pending狀態(tài)時(shí)春锋,無(wú)法得知目前進(jìn)展到哪一個(gè)階段(剛剛開始還是即將完成)矫膨。

1.4基本用法

let promise = new Promise(function(resolve,reject){
// resolve 成功后調(diào)用
// reject 失敗后調(diào)用
})

promise.then(res => {
//傳入成功狀態(tài)參數(shù)

},err => {
//傳入失敗狀態(tài)參數(shù)
})

1.5 then方法

then方法返回的是一個(gè)Promise對(duì)象。因此使用then方法后還能繼續(xù)使用then方法期奔。

let aa = Promise.resolve('11');
console.log(aa.then());//Promise {<fulfilled>: "11"}

then方法根據(jù)不同的狀態(tài)侧馅,看看需要走then的第一個(gè)參數(shù)還是第二個(gè)。

resolve()和reject()的參數(shù)會(huì)傳遞到對(duì)應(yīng)的回調(diào)函數(shù)的data或err呐萌。

        aa.then(data => {
                console.log(data)
            },
            err => {
                console.log(err)
            }
        )

1.6捕獲錯(cuò)誤

.catch方法是.then(null, rejection)的別名馁痴,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。
再來(lái)展示一下:

  let promise1 = new Promise((res, rej) => {
            rej('11');
        }).catch(err => {
            console.log('err1', err);//err1  11
        })
   let promise2 = new Promise((res, rej) => {
            rej('11');
        }).then(null, err => {
            console.log('err2', err);//err2  11
        })

講一下then(null,err => {});用null代替resolve狀態(tài)走的then的第一個(gè)參數(shù)肺孤,那么第二個(gè)自然就是失斅拊巍(reject)狀態(tài)走的嘍。

1.7 resolve與reject方法.

可以方便的創(chuàng)建一個(gè)已經(jīng)是成功或失敗狀態(tài)的Promise對(duì)象赠堵。

Promise.resolve('成功');
//等價(jià)于
new Promise((resolve,reject) => {
resolve('成功')
})

Promise.resolve('失敗');
//等價(jià)于
new Promise((resolve,reject) => {
reject('失敗')
})

接收參數(shù)的四種情況小渊。

1.Promise.resolve()

1、參數(shù)是一個(gè)Promise實(shí)例

        let promise = new Promise((resolve, reject) => {
            resolve('成功');
        })
        let test1 = Promise.resolve(promise);
        console.log(test1);//Promise {<fulfilled>: "成功"}

resolve()方法保留Promise實(shí)例的狀態(tài)茫叭。
2粤铭、參數(shù)是一個(gè)是具有then方法的對(duì)象。

        let thenable = {
            then: function(resolve, reject) {
                resolve(42);
            }

        };
        let test2 = Promise.resolve(thenable);
        console.log(test2); // Promise {<pending>}

        test2.then(res => {
                console.log(res);//42
          })

Promise.resolve方法會(huì)將thenable轉(zhuǎn)為 Promise 對(duì)象杂靶,然后就立即執(zhí)行thenable對(duì)象的then方法梆惯。而后對(duì)象p1的狀態(tài)就變?yōu)閞esolved,從而立即執(zhí)行最后那個(gè)then方法指定的回調(diào)函數(shù)吗垮,輸出 42垛吗。
3、參數(shù)不是對(duì)象烁登。

const p = Promise.resolve('Hello');

p.then(function (s){
  console.log(s)
});
// Hello

4怯屉、不帶參數(shù)蔚舀。

const p = Promise.resolve();//Promise {<fulfilled>: undefined}

2.Promise.reject()

原封不動(dòng)的返回reject狀態(tài)。
特別的是锨络,當(dāng)參數(shù)為包含then方法的對(duì)象時(shí)赌躺。

      let thenable = {
            then: function(resolve, reject) {
                resolve('出錯(cuò)');
            }
        };
        let test2 = Promise.reject(thenable);
        test2.then(null, err => {
                console.log(err); //{then: ?}
            })

這里返回的不是 “出錯(cuò)” 。而是整個(gè)then對(duì)象羡儿。

3.Promise.all()

all()方法的參數(shù)都是promise對(duì)象,切必須都是resolve狀態(tài)礼患。

        let p1 = Promise.resolve('p1');
        let p2 = Promise.resolve('p2');
        let p3 = Promise.resolve('p3');
        Promise.all([p1, p2, p3]).then(res => {
            let [res1, res2, res3] = res;
            console.log(res1, res2, res3);//p1,p2,p3
        })
//當(dāng)有一個(gè)參數(shù)是reject狀態(tài)時(shí)
        let p1 = Promise.resolve('p1');
        let p2 = Promise.reject('p2');
        let p3 = Promise.resolve('p3');
        Promise.all([p1, p2, p3]).then(res => {
                let [res1, res2, res3] = res;
                console.log(res1, res2, res3); //Uncaught (in promise) p2
            })

3.Promise.race()

Promise.race([p1,p2,p3])
這個(gè)和all用法一樣,唯一不同之處就是race方法,只要最前面一個(gè)resolve就可以正常執(zhí)行,如果第一個(gè)是rejecj狀態(tài)就報(bào)錯(cuò)掠归。

        let p1 = Promise.resolve('p1');
        let p2 = Promise.resolve('p2');
        let p3 = Promise.reject('p3');
        Promise.race([p1, p2, p3]).then(res => {
                console.log(res) //p1
            })
        //如果第一個(gè)是reject的話
        let p1 = Promise.reject('p1');
        let p2 = Promise.resolve('p2');
        let p3 = Promise.resolve('p3');
        Promise.race([p1, p2, p3]).then(res => {
                console.log(res) // Uncaught (in promise) p1
            })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缅叠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虏冻,更是在濱河造成了極大的恐慌肤粱,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厨相,死亡現(xiàn)場(chǎng)離奇詭異领曼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蛮穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門庶骄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绪撵,你說(shuō)我怎么就攤上這事瓢姻。” “怎么了音诈?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵幻碱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我细溅,道長(zhǎng)褥傍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任喇聊,我火速辦了婚禮恍风,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘誓篱。我一直安慰自己朋贬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布窜骄。 她就那樣靜靜地躺著锦募,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邻遏。 梳的紋絲不亂的頭發(fā)上糠亩,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天虐骑,我揣著相機(jī)與錄音,去河邊找鬼赎线。 笑死廷没,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垂寥。 我是一名探鬼主播颠黎,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矫废!你這毒婦竟也來(lái)了盏缤?” 一聲冷哼從身側(cè)響起砰蠢,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蓖扑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后台舱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體律杠,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年竞惋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柜去。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拆宛,死狀恐怖嗓奢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浑厚,我是刑警寧澤股耽,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站钳幅,受9級(jí)特大地震影響物蝙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敢艰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一诬乞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钠导,春花似錦震嫉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至湃望,卻和暖如春换衬,著一層夾襖步出監(jiān)牢的瞬間痰驱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工瞳浦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留担映,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓叫潦,卻偏偏與公主長(zhǎng)得像蝇完,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矗蕊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • 一短蜕、Promise的含義 Promise在JavaScript語(yǔ)言中早有實(shí)現(xiàn),ES6將其寫進(jìn)了語(yǔ)言標(biāo)準(zhǔn)傻咖,統(tǒng)一了用法...
    Alex灌湯貓閱讀 820評(píng)論 0 2
  • 概述 Promise 對(duì)象是 JavaScript 的異步操作解決方案朋魔,為異步操作提供統(tǒng)一接口。它起到代理作用(p...
    nucky_lee閱讀 965評(píng)論 0 1
  • Promise是什么卿操? JavaScript語(yǔ)言的一大特點(diǎn)就是單線程警检,也就是說(shuō),同一個(gè)時(shí)間只能做一件事害淤。 由于這個(gè)...
    小泡_08f5閱讀 4,015評(píng)論 1 2
  • ES6 Promise 先拉出來(lái)遛遛復(fù)雜的概念先不講扇雕,我們先簡(jiǎn)單粗暴地把Promise用一下,有個(gè)直觀感受窥摄。那么第...
    Baiter閱讀 615評(píng)論 0 1
  • 一崭放、規(guī)范[https://promisesaplus.com/]簡(jiǎn)介 術(shù)語(yǔ):Promise 是具有then方法的...
    帶刀打天下閱讀 1,443評(píng)論 0 2