異步的那些事(三)--Promise

從上一篇看出掏颊,簡單封裝后的deferred與如今的Promise非常相似某抓,尤其是最后那個(gè)返回dtd.promise()的例子揖膜,則直接返回了一個(gè)promise對象看锉。介紹了promise的前世以后姿锭,再來看看它的今生。

如今的promise伯铣,有異常捕獲呻此,可多個(gè)串聯(lián),Promise.all和Promise.race等用法腔寡。下面將根據(jù)promise的用法由淺入深的舉例子焚鲜。

首先,可以通過Promise將一個(gè)異步操作new成Promise的一個(gè)實(shí)例放前,從而我們在這個(gè)實(shí)例上進(jìn)行更加優(yōu)雅的操作忿磅,而不是之前的用callback形式,從前面的學(xué)習(xí)可以知道這樣做解耦了代碼凭语,很好體現(xiàn)了編程界 開放封閉 的原則葱她。這個(gè)例子見下圖,通過promise對加載圖片操作進(jìn)行封裝似扔。從而有對w的鏈?zhǔn)讲僮鞫中_@里有個(gè)小知識點(diǎn),想要第二個(gè).then操作接收到數(shù)據(jù)炒辉,從而處理數(shù)據(jù)豪墅,在第一個(gè).then操作后面要返回接收到的數(shù)數(shù)據(jù)(而這個(gè)數(shù)據(jù)針對這個(gè)例子是我們封裝操作的時(shí)候傳進(jìn)去的img信息)。

Promise構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù)辆脸,該函數(shù)的參數(shù)分別是resolve和reject兩個(gè)函數(shù)但校,它們由JS引擎提供螃诅,不用我們部署啡氢。resolve函數(shù)的作用是,執(zhí)行resolve后术裸,將Promise對象狀態(tài)從'pending'變?yōu)?resolved'(.then中的第一個(gè)函數(shù)在監(jiān)聽到這個(gè)狀態(tài)變化倘是,則會執(zhí)行),同時(shí)可以傳遞參數(shù)出去;reject函數(shù)作用則是袭艺,執(zhí)行完它將Promise對象狀態(tài)從'pending'變?yōu)?rejected'(.then中的第二個(gè)函數(shù)在監(jiān)聽到這個(gè)狀態(tài)變化搀崭,則會執(zhí)行),也可以傳遞參數(shù)出去。所以說在封裝異步操作為Promise對象時(shí)候瘤睹,一定注意不要主動去觸發(fā)resolve或者reject升敲,否則你將得不到你想要的結(jié)果。比如下面的這個(gè)例子轰传,我們在封裝Promise對象的時(shí)候直接觸發(fā)了reject驴党,而不是在img.onerror時(shí)候才觸發(fā)它,并且這個(gè)例子里面?zhèn)魅胍粋€(gè)字符串获茬「圩可以看出,由于狀態(tài)發(fā)生變化恕曲,.then的第二個(gè)函數(shù)或者.catch監(jiān)聽到了則做出應(yīng)對鹏氧。

下面再接著舉一個(gè)封裝ajax的例子,方便與上面例子一些細(xì)節(jié)比較佩谣。(這里我覺得ajax在1.5之后已經(jīng)支持類似的鏈?zhǔn)讲僮靼鸦梗瑢?shí)際用的時(shí)候也不用封裝也能達(dá)到相同的效果(可以看我前面的一篇文章Deferred有舉例),但是為什么還有很多人去封裝成promise再用稿存,我也在思考笨篷?)

以前我們用ajax時(shí)候偶爾會遇到這樣的問題,當(dāng)我們需要將程序中的數(shù)據(jù)傳遞到callback函數(shù)里面瓣履,我們可能會采用下面的寫法:


現(xiàn)在有了promise我們可以做的更加優(yōu)雅率翅,因?yàn)閞esolve可以傳遞參數(shù),但是貌似規(guī)定只能傳一個(gè)參數(shù)袖迎,所以我們可以用數(shù)組或者對象形式冕臭,將我們要傳的多個(gè)參數(shù)進(jìn)行包裝,用數(shù)組傳遞例子如下:

實(shí)際工作中我們總要對promise實(shí)例進(jìn)行異常處理燕锥,在.這里我們用.catch捕獲異常辜贵,一般來說,我們不要在.then方法中定義rejected狀態(tài)的函數(shù)(then的第二個(gè)參數(shù))归形,而總是用catch方法托慨。這個(gè)寫法跟我們以前用的try{}catch{}的用法很相似。在《ECMAScript6入門》一書中學(xué)習(xí)到暇榴,catch的方法其實(shí)是指Promise.prototype.catch厚棵,它是.then(null,rejection)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù),但是請注意當(dāng)Promise狀態(tài)已經(jīng)變成resolved蔼紧,再拋出錯(cuò)誤是無效的婆硬,看下面的第二個(gè)圖片。

實(shí)際工作中奸例,我們經(jīng)常要控制異步操作的執(zhí)行順序彬犯,比如ajax的順序執(zhí)行,或者圖片的順序加載。比如實(shí)現(xiàn)圖片的順序加載的例子如下谐区,在第一個(gè)實(shí)例后返回第二個(gè)實(shí)例湖蜕。

? ?Promise.all接收一個(gè)promise數(shù)組,待全部完成之后宋列,統(tǒng)一執(zhí)行success重荠,比如下面的例子,打印出來的圖片寬度與上面一致虚茶,注意這里返回的是一個(gè)數(shù)組戈鲁,因?yàn)槭且唤Mpromise實(shí)例的返回。

Promise.race接受一個(gè)promise數(shù)組嘹叫,其中任何一個(gè)完成婆殿,就執(zhí)行success。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罩扇,一起剝皮案震驚了整個(gè)濱河市婆芦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喂饥,老刑警劉巖消约,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異员帮,居然都是意外死亡或粮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門捞高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氯材,“玉大人,你說我怎么就攤上這事硝岗∏庀” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵型檀,是天一觀的道長冗尤。 經(jīng)常有香客問我,道長胀溺,這世上最難降的妖魔是什么裂七? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮月幌,結(jié)果婚禮上碍讯,老公的妹妹穿的比我還像新娘悬蔽。我一直安慰自己扯躺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著录语,像睡著了一般倍啥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澎埠,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天虽缕,我揣著相機(jī)與錄音,去河邊找鬼蒲稳。 笑死氮趋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的江耀。 我是一名探鬼主播剩胁,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祥国!你這毒婦竟也來了昵观?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舌稀,失蹤者是張志新(化名)和其女友劉穎啊犬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壁查,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡觉至,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睡腿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片康谆。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嫉到,靈堂內(nèi)的尸體忽然破棺而出沃暗,到底是詐尸還是另有隱情,我是刑警寧澤何恶,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布孽锥,位于F島的核電站,受9級特大地震影響细层,放射性物質(zhì)發(fā)生泄漏惜辑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一疫赎、第九天 我趴在偏房一處隱蔽的房頂上張望盛撑。 院中可真熱鬧,春花似錦捧搞、人聲如沸抵卫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽介粘。三九已至殖氏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姻采,已是汗流浹背雅采。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慨亲,地道東北人婚瓜。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像刑棵,于是被迫代替她去往敵國和親闰渔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案铐望,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,710評論 1 56
  • 本文適用的讀者 本文寫給有一定Promise使用經(jīng)驗(yàn)的人冈涧,如果你還沒有使用過Promise,這篇文章可能不適合你正蛙,...
    HZ充電大喵閱讀 7,313評論 6 19
  • Prepending(進(jìn)行時(shí))督弓,Resolve(成功了),Reject(失敗了)乒验,then......等 1.Pr...
    _菩提本無樹_閱讀 49,078評論 0 21
  • 一愚隧、Promise的含義 Promise在JavaScript語言中早有實(shí)現(xiàn),ES6將其寫進(jìn)了語言標(biāo)準(zhǔn)锻全,統(tǒng)一了用法...
    Alex灌湯貓閱讀 827評論 0 2
  • 愛情狂塘, 他們說, 它很甜鳄厌, 甜到想擁有一輩子荞胡, 甜到海誓山盟。 他們說了嚎, 它很苦泪漂, 苦到一陣而過, 苦到連碰都不敢...
    雪夢純郎閱讀 200評論 0 5