es6中Promise 對(duì)象

一抽减、Promise 的含義

1祥得、Promise 是異步編程的一種解決方案兔沃,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。

所謂Promise级及,簡(jiǎn)單說(shuō)就是一個(gè)容器乒疏,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果。從語(yǔ)法上說(shuō)创千,Promise 是一個(gè)對(duì)象缰雇,從它可以獲取異步操作的消息。

2追驴、Promise對(duì)象有以下兩個(gè)特點(diǎn)。

(1)對(duì)象的狀態(tài)不受外界影響疏之。Promise對(duì)象代表一個(gè)異步操作殿雪,有三種狀態(tài):Pending(進(jìn)行中)、Resolved(已完成锋爪,又稱(chēng) Fulfilled)和Rejected(已失敱铩)。只有異步操作的結(jié)果其骄,可以決定當(dāng)前是哪一種狀態(tài)亏镰,任何其他操作都無(wú)法改變這個(gè)狀態(tài)。

(2)一旦狀態(tài)改變拯爽,就不會(huì)再變索抓,任何時(shí)候都可以得到這個(gè)結(jié)果。Promise對(duì)象的狀態(tài)改變毯炮,只有兩種可能:從Pending變?yōu)镽esolved和從Pending變?yōu)镽ejected逼肯。只要這兩種情況發(fā)生,狀態(tài)就凝固了桃煎,不會(huì)再變了篮幢,會(huì)一直保持這個(gè)結(jié)果。如果改變已經(jīng)發(fā)生了为迈,你再對(duì)Promise對(duì)象添加回調(diào)函數(shù)三椿,也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同葫辐,事件的特點(diǎn)是搜锰,如果你錯(cuò)過(guò)了它,再去監(jiān)聽(tīng)另患,是得不到結(jié)果的纽乱。

有了Promise對(duì)象,就可以將異步操作以同步操作的流程表達(dá)出來(lái)昆箕,避免了層層嵌套的回調(diào)函數(shù)鸦列。此外租冠,Promise對(duì)象提供統(tǒng)一的接口,使得控制異步操作更加容易薯嗤。

3顽爹、Promise也有一些缺點(diǎn)。

(1)首先骆姐,無(wú)法取消Promise镜粤,一旦新建它就會(huì)立即執(zhí)行,無(wú)法中途取消玻褪。

(2)其次肉渴,如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤带射,不會(huì)反應(yīng)到外部同规。第三,當(dāng)處于Pending狀態(tài)時(shí)窟社,無(wú)法得知目前進(jìn)展到哪一個(gè)階段.券勺。

二、基本用法

1灿里、ES6 規(guī)定关炼,Promise對(duì)象是一個(gè)構(gòu)造函數(shù),用來(lái)生成Promise實(shí)例匣吊。

下面代碼創(chuàng)造了一個(gè)Promise實(shí)例儒拂。


Promise構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是resolve和reject缀去。它們是兩個(gè)函數(shù)侣灶,由 JavaScript 引擎提供,不用自己部署缕碎。

resolve函數(shù)的作用是褥影,將Promise對(duì)象的狀態(tài)從“未完成”變?yōu)椤俺晒Α保磸?Pending 變?yōu)?Resolved),在異步操作成功時(shí)調(diào)用咏雌,并將異步操作的結(jié)果凡怎,作為參數(shù)傳遞出去;reject函數(shù)的作用是赊抖,將Promise對(duì)象的狀態(tài)從“未完成”變?yōu)椤笆 保磸?Pending 變?yōu)?Rejected)统倒,在異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤氛雪,作為參數(shù)傳遞出去房匆。

2、Promise實(shí)例生成以后,可以用then方法分別指定Resolved狀態(tài)和Reject狀態(tài)的回調(diào)函數(shù)浴鸿。


then方法可以接受兩個(gè)回調(diào)函數(shù)作為參數(shù)井氢。第一個(gè)回調(diào)函數(shù)是Promise對(duì)象的狀態(tài)變?yōu)镽esolved時(shí)調(diào)用,第二個(gè)回調(diào)函數(shù)是Promise對(duì)象的狀態(tài)變?yōu)镽ejected時(shí)調(diào)用岳链。其中花竞,第二個(gè)函數(shù)是可選的,不一定要提供掸哑。這兩個(gè)函數(shù)都接受Promise對(duì)象傳出的值作為參數(shù)约急。

3、下面是一個(gè)用Promise對(duì)象實(shí)現(xiàn)的 Ajax 操作的例子苗分。


在上面代碼中厌蔽,getJSON是對(duì) XMLHttpRequest 對(duì)象的封裝,用于發(fā)出一個(gè)針對(duì) JSON 數(shù)據(jù)的 HTTP 請(qǐng)求摔癣,并且返回一個(gè)Promise對(duì)象躺枕。需要注意的是,在getJSON內(nèi)部供填,resolve函數(shù)和reject函數(shù)調(diào)用時(shí),都帶有參數(shù)罢猪。

4近她、Promise.prototype.then()

Promise 實(shí)例具有then方法,也就是說(shuō)膳帕,then方法是定義在原型對(duì)象Promise.prototype上的粘捎。它的作用是為 Promise 實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù)。前面說(shuō)過(guò)危彩,then方法的第一個(gè)參數(shù)是Resolved狀態(tài)的回調(diào)函數(shù)攒磨,第二個(gè)參數(shù)(可選)是Rejected狀態(tài)的回調(diào)函數(shù)。

5汤徽、Promise.prototype.catch()

Promise.prototype.catch方法是.then(null, rejection)的別名娩缰,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。

6谒府、Promise.all()

Promise.all方法用于將多個(gè) Promise 實(shí)例拼坎,包裝成一個(gè)新的 Promise 實(shí)例。

7完疫、Promise.race()

Promise.race方法同樣是將多個(gè)Promise實(shí)例泰鸡,包裝成一個(gè)新的Promise實(shí)例。

8壳鹤、Promise.resolve()

有時(shí)需要將現(xiàn)有對(duì)象轉(zhuǎn)為Promise對(duì)象盛龄,Promise.resolve方法就起到這個(gè)作用。

Promise.resolve方法的參數(shù)分成四種情況。

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

如果參數(shù)是Promise實(shí)例余舶,那么Promise.resolve將不做任何修改啊鸭、原封不動(dòng)地返回這個(gè)實(shí)例。

(2)參數(shù)是一個(gè)thenable對(duì)象

thenable對(duì)象指的是具有then方法的對(duì)象欧芽,比如下面這個(gè)對(duì)象莉掂。

(3)參數(shù)不是具有then方法的對(duì)象,或根本就不是對(duì)象

如果參數(shù)是一個(gè)原始值千扔,或者是一個(gè)不具有then方法的對(duì)象憎妙,則Promise.resolve方法返回一個(gè)新的Promise對(duì)象,狀態(tài)為Resolved曲楚。

(4)不帶有任何參數(shù)

Promise.resolve方法允許調(diào)用時(shí)不帶參數(shù)厘唾,直接返回一個(gè)Resolved狀態(tài)的Promise對(duì)象。

所以龙誊,如果希望得到一個(gè)Promise對(duì)象抚垃,比較方便的方法就是直接調(diào)用Promise.resolve方法。

9趟大、Promise.reject()

Promise.reject(reason)方法也會(huì)返回一個(gè)新的 Promise 實(shí)例鹤树,該實(shí)例的狀態(tài)為rejected。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逊朽,一起剝皮案震驚了整個(gè)濱河市罕伯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叽讳,老刑警劉巖追他,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岛蚤,居然都是意外死亡邑狸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)涤妒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)单雾,“玉大人,你說(shuō)我怎么就攤上這事届腐√玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵犁苏,是天一觀的道長(zhǎng)硬萍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)围详,這世上最難降的妖魔是什么朴乖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任祖屏,我火速辦了婚禮,結(jié)果婚禮上买羞,老公的妹妹穿的比我還像新娘袁勺。我一直安慰自己,他們只是感情好畜普,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布期丰。 她就那樣靜靜地躺著,像睡著了一般吃挑。 火紅的嫁衣襯著肌膚如雪钝荡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天舶衬,我揣著相機(jī)與錄音埠通,去河邊找鬼。 笑死逛犹,一個(gè)胖子當(dāng)著我的面吹牛端辱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虽画,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼舞蔽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了码撰?” 一聲冷哼從身側(cè)響起喷鸽,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灸拍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體砾省,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸡岗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了编兄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轩性。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狠鸳,靈堂內(nèi)的尸體忽然破棺而出揣苏,到底是詐尸還是另有隱情,我是刑警寧澤件舵,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布卸察,位于F島的核電站,受9級(jí)特大地震影響铅祸,放射性物質(zhì)發(fā)生泄漏坑质。R本人自食惡果不足惜合武,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涡扼。 院中可真熱鬧稼跳,春花似錦、人聲如沸吃沪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)票彪。三九已至红淡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抹镊,已是汗流浹背锉屈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垮耳,地道東北人颈渊。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像终佛,于是被迫代替她去往敵國(guó)和親俊嗽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • Promise的含義: ??Promise是異步編程的一種解決方案铃彰,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和...
    呼呼哥閱讀 2,166評(píng)論 0 16
  • 00牙捉、前言Promise 是異步編程的一種解決方案竹揍,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)...
    夜幕小草閱讀 2,128評(píng)論 0 12
  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器邪铲,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果芬位,語(yǔ)法上說(shuō),Pr...
    雨飛飛雨閱讀 3,352評(píng)論 0 19
  • 我是一枚財(cái)務(wù)妹紙带到,剛畢業(yè)2年多昧碉。我覺(jué)得我現(xiàn)在首要任務(wù)是積累財(cái)務(wù)專(zhuān)業(yè)知識(shí)和技能,考取專(zhuān)業(yè)資格證書(shū)揽惹,提升自己工作能力和...
    曉曉002閱讀 188評(píng)論 0 0
  • 宇宙這么大被饿,地球這么小,我們總能再遇見(jiàn)搪搏。――《誰(shuí)的青春不迷惘》
    微_風(fēng)起閱讀 127評(píng)論 0 0