ES6新增的promise異步編程解決方案

第1章 準(zhǔn)備

?1.1 區(qū)別實(shí)例對(duì)象與函數(shù)對(duì)象

(1).實(shí)例對(duì)象:通過? ? new 函數(shù)? ? 產(chǎn)生的對(duì)象撒璧,稱為實(shí)例對(duì)象透葛,簡(jiǎn)稱對(duì)象
(2).函數(shù)對(duì)象:將函數(shù)作為對(duì)象使用時(shí),簡(jiǎn)稱函數(shù)對(duì)象

1.2 兩種類型的回調(diào)函數(shù)

(1).?同步回調(diào):?

??????理解:?立即執(zhí)行,?完全執(zhí)行完了才結(jié)束,?不會(huì)放入回調(diào)隊(duì)列中

??????例子:?數(shù)組遍歷相關(guān)的回調(diào)函數(shù)?/?Promise的excutor函數(shù)

(2).?異步回調(diào):?

??????理解:?不會(huì)立即執(zhí)行,?會(huì)放入回調(diào)隊(duì)列中將來執(zhí)行

??????例子:?定時(shí)器回調(diào)?/?ajax回調(diào)?/?Promise的成功|失敗的回調(diào)

1.3 JS的 error 處理

(1)? 錯(cuò)誤的類型

????1.?Error:所有錯(cuò)誤的父類型

????2.?ReferenceError:引用的變量不存在

????3.?RangeError:數(shù)據(jù)值不在其所允許的范圍內(nèi)

????4.?SyntaxError:語法錯(cuò)誤

(2)? 錯(cuò)誤的處理

    捕獲錯(cuò)誤:try...catch

    拋出錯(cuò)誤:throw?error

第2章 promise的理解和使用

2.1 promise是什么卿樱?

2.1.1 理解

1.抽象表達(dá):

 Promise是JS中進(jìn)行異步編程的新的解決方案

2.具體表達(dá)

 從語法上來說:Promise是一個(gè)構(gòu)造函數(shù)

 從功能上來說:promise對(duì)象用來封裝一個(gè)異步操作并可以獲取其結(jié)果

2.1.2 promise的狀態(tài)改變

 1. pending 變?yōu)?resolved

 2. pending 變?yōu)?rejected

 說明:只有這2種僚害,且一個(gè)promise對(duì)象只能改變一次

  無論變?yōu)槌晒€是失敗,都會(huì)有一個(gè)結(jié)果數(shù)據(jù)

  成功的結(jié)果數(shù)據(jù)一般稱為 value繁调,失敗的結(jié)果數(shù)據(jù)一般稱為 reason

2.1.3 promise的基本流程

?2.1.4 promise的基本使用

2.2 為什么要用Promise萨蚕?

2.2.1 指定回調(diào)函數(shù)的方式更加靈活

  1.舊的方案:必須在啟動(dòng)異步任務(wù)前指定

  2.promise:?jiǎn)?dòng)異步任務(wù) => 返回promise對(duì)象 => 給promise對(duì)象綁定回調(diào)函數(shù)(甚至可以在異步任務(wù)結(jié)束后指定/多個(gè))

2.2.2 支持鏈?zhǔn)秸{(diào)用,可以解決回調(diào)地獄問題

  1.什么是回調(diào)地獄蹄胰?

    回調(diào)函數(shù)嵌套調(diào)用岳遥,外部回調(diào)函數(shù)異步執(zhí)行結(jié)果是嵌套的回調(diào)執(zhí)行的條件

  2.回調(diào)地獄的缺點(diǎn)?

    不方便閱讀

    不便于異常處理

  3.解決方案烤送?

    promise 鏈?zhǔn)秸{(diào)用

  4.終極解決方案寒随?

    async / await

2.3 如何使用promise

2.3.1 API

 1. Promise 構(gòu)造函數(shù):Promise(excutor) {}

  (1) excutor 函數(shù):執(zhí)行器 { resolve, reject } => {}

  (2) resolve 函數(shù):內(nèi)部定義成功時(shí)我們調(diào)用的函數(shù) value => {}

  (3) reject 函數(shù):內(nèi)部定義失敗時(shí)我們調(diào)用的函數(shù) reason => {}

 說明:excutor 會(huì)在 Promise 內(nèi)部立即同步回調(diào),異步操作在執(zhí)行器中執(zhí)行

? ? 2.?Promise.prototype.then方法:?(onResolved,?onRejected)?=>?{}

? ? ? ? onResolved函數(shù):?成功的回調(diào)函數(shù)??(value)?=>?{}

? ? ? ? onRejected函數(shù):?失敗的回調(diào)函數(shù)?(reason)?=>?{}

? ? ? ? 說明:?指定用于得到成功value的成功回調(diào)和用于得到失敗reason的失敗回調(diào)

? ? ? ? ? ? 返回一個(gè)新的promise對(duì)象

? ? 3.?Promise.prototype.catch方法:?(onRejected)?=>?{}

? ? ? ? ?onRejected函數(shù):?失敗的回調(diào)函數(shù)?(reason)?=>?{}

? ? ? ? ?說明:?then()的語法糖,?相當(dāng)于:?then(undefined,?onRejected)

? ? 4.?Promise.resolve方法:?(value)?=>?{}

? ? ? ? value:?成功的數(shù)據(jù)或promise對(duì)象

? ? ? ? 說明:?返回一個(gè)成功/失敗的promise對(duì)象

? ? 5.?Promise.reject方法:?(reason)?=>?{}

? ? ? ? reason:?失敗的原因

? ? ? ? 說明:?返回一個(gè)失敗的promise對(duì)象

? ? 6.?Promise.all方法:?(promises)?=>?{}

? ? ? ? promises:?包含n個(gè)promise的數(shù)組

? ? ? ? 說明:?返回一個(gè)新的promise,?只有所有的promise都成功才成功,?只要有一個(gè)失敗了就直接失敗

? ? 7.?Promise.race方法:?(promises)?=>?{}

? ? ? ? promises:?包含n個(gè)promise的數(shù)組

? ? ? ? 說明:?返回一個(gè)新的promise,?第一個(gè)完成的promise的結(jié)果狀態(tài)就是最終的結(jié)果狀態(tài)

?2.3.2 promise的幾個(gè)關(guān)鍵問題

????1.??如何改變promise的狀態(tài)?

? ? ?(1)resolve(value):?如果當(dāng)前是pendding就會(huì)變?yōu)閞esolved

? ? ?(2)reject(reason):?如果當(dāng)前是pendding就會(huì)變?yōu)閞ejected

? ? ?(3)拋出異常:?如果當(dāng)前是pendding就會(huì)變?yōu)閞ejected

? ? 2.??一個(gè)promise指定多個(gè)成功/失敗回調(diào)函數(shù),?都會(huì)調(diào)用嗎?

? ? ? ????當(dāng)promise改變?yōu)閷?duì)應(yīng)狀態(tài)時(shí)都會(huì)調(diào)用

? ?3.改變promise狀態(tài)和指定回調(diào)函數(shù)誰先誰后?

? ? ? (1) 都有可能,?正常情況下是先指定回調(diào)再改變狀態(tài),?但也可以先改狀態(tài)再指定回調(diào)

? ? ? (2) 如何先改狀態(tài)再指定回調(diào)?

???????? “锛帷①在執(zhí)行器中直接調(diào)用resolve() / reject()

????????  ②延遲更長(zhǎng)時(shí)間才調(diào)用then()

? ? ? (3)什么時(shí)候才能得到數(shù)據(jù)?

???????   ①如果先指定的回調(diào),?那當(dāng)狀態(tài)發(fā)生改變時(shí),?回調(diào)函數(shù)就會(huì)調(diào)用,?得到數(shù)據(jù)

???????? ? ? ②如果先改變的狀態(tài),?那當(dāng)指定回調(diào)時(shí),?回調(diào)函數(shù)就會(huì)調(diào)用,?得到數(shù)據(jù)

?4.??promise.then()返回的新promise的結(jié)果狀態(tài)由什么決定?

? ? ? (1)簡(jiǎn)單表達(dá):?由then()指定的回調(diào)函數(shù)執(zhí)行的結(jié)果決定

? ? ? (2)詳細(xì)表達(dá):

? ? ? ? ? ①如果拋出異常,?新promise變?yōu)閞ejected,?reason為拋出的異常

? ? ? ? ? ②如果返回的是非promise的任意值,?新promise變?yōu)閞esolved,?value為返回的值

? ? ? ? ? ③如果返回的是另一個(gè)新promise,?此promise的結(jié)果就會(huì)成為新promise的結(jié)果?

 5.promise如何串連多個(gè)操作任務(wù)?

?????? (1) promise的then()返回一個(gè)新的promise,?可以看成then()的鏈?zhǔn)秸{(diào)用

?????? (2) 通過then的鏈?zhǔn)秸{(diào)用串連多個(gè)同步/異步任務(wù)

 6.promise異常傳 / 穿透?

? ? ? (1)當(dāng)使用promise的then鏈?zhǔn)秸{(diào)用時(shí),?可以在最后指定失敗的回調(diào),?

? ? ? (2)前面任何操作出了異常,?都會(huì)傳到最后失敗的回調(diào)中處理

 7.中斷promise鏈?

? ? ? (1)當(dāng)使用promise的then鏈?zhǔn)秸{(diào)用時(shí),?在中間中斷,?不再調(diào)用后面的回調(diào)函數(shù)

? ? ? (2)辦法:?在回調(diào)函數(shù)中返回一個(gè)pendding狀態(tài)的promise對(duì)象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末互艾,一起剝皮案震驚了整個(gè)濱河市试和,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纫普,老刑警劉巖阅悍,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件好渠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡节视,警方通過查閱死者的電腦和手機(jī)拳锚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寻行,“玉大人霍掺,你說我怎么就攤上這事“柚” “怎么了杆烁?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)简卧。 經(jīng)常有香客問我兔魂,道長(zhǎng),這世上最難降的妖魔是什么举娩? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任析校,我火速辦了婚禮,結(jié)果婚禮上铜涉,老公的妹妹穿的比我還像新娘勺良。我一直安慰自己,他們只是感情好骄噪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布尚困。 她就那樣靜靜地躺著,像睡著了一般链蕊。 火紅的嫁衣襯著肌膚如雪事甜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天滔韵,我揣著相機(jī)與錄音逻谦,去河邊找鬼。 笑死陪蜻,一個(gè)胖子當(dāng)著我的面吹牛邦马,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宴卖,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滋将,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了症昏?” 一聲冷哼從身側(cè)響起随闽,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肝谭,沒想到半個(gè)月后掘宪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾扇,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年魏滚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镀首。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鼠次,死狀恐怖更哄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情须眷,我是刑警寧澤竖瘾,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站花颗,受9級(jí)特大地震影響捕传,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扩劝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一庸论、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棒呛,春花似錦聂示、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至趋观,卻和暖如春扛禽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皱坛。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工编曼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剩辟。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓掐场,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贩猎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熊户,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 你不知道JS:異步 第三章:Promises 在第二章,我們指出了采用回調(diào)來表達(dá)異步和管理并發(fā)時(shí)的兩種主要不足:缺...
    purple_force閱讀 2,066評(píng)論 0 4
  • 1. Promise 的含義 所謂Promise融欧,簡(jiǎn)單說就是一個(gè)容器敏弃,里面保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)...
    ROBIN2015閱讀 490評(píng)論 0 0
  • 弄懂js異步 講異步之前,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop噪馏。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,710評(píng)論 0 5
  • 參考深入理解 Promise 五部曲 -- 1.異步問題[http://www.ghostchina.com/pr...
    合肥黑閱讀 2,296評(píng)論 0 14
  • 2017年12月6號(hào) 知食小菜譜 《芝士流心撻》 知食小話題 小編雙十一的時(shí)候欠肾,買了某家網(wǎng)紅甜品店的芝士流心撻瓶颠,抱...
    知食百科閱讀 353評(píng)論 0 0