第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ì)象