PS~:?Promise是一個(gè)構(gòu)造函數(shù),自己身上有all、reject佳恬、resolve等幾個(gè)方法,原型上有then结耀、catch等幾個(gè)方法。
Promise 對(duì)象用于表示一個(gè)異步操作的最終狀態(tài)(完成或失敗),以及其返回的值牡彻。
一、Promise有以下三種狀態(tài):
pending: 初始狀態(tài)出爹,既不是成功讨便,也不是失敗狀態(tài) , ( 等待中 , 或者進(jìn)行中 , 表示還沒(méi)有得到結(jié)果 )
fulfilled: 意味著操作成功。
rejected: 意味著操作失敗以政。
Promise有兩種狀態(tài)改變的方式,而且狀態(tài)只能從pending改變?yōu)閞esolved或者rejected伴找,并且不可逆盈蛮。當(dāng)狀態(tài)發(fā)生變化,Promise.then綁定的函數(shù)就會(huì)被調(diào)用技矮。
注意:Promise一旦新建就會(huì)「立即執(zhí)行」抖誉,無(wú)法取消。這也是它的缺點(diǎn)之一衰倦。
二袒炉、我們使用new來(lái)構(gòu)建一個(gè)Promise。
Promise接受一個(gè)「函數(shù)」作為參數(shù)樊零,該函數(shù)的兩個(gè)參數(shù)分別是resolve和reject我磁。這兩個(gè)函數(shù)就是就是「回調(diào)函數(shù)」
resolve函數(shù)的作用:在異步操作成功時(shí)調(diào)用,并將異步操作的結(jié)果驻襟,作為參數(shù)傳遞出去夺艰;?
reject函數(shù)的作用:在異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤沉衣,作為參數(shù)傳遞出去郁副。
如果異步操作獲得了我們想要的結(jié)果,那我們將手動(dòng)調(diào)用resolve函數(shù)豌习,在then的第一個(gè)作為參數(shù)的匿名函數(shù)中可以獲取數(shù)據(jù)存谎,如果我們得到了錯(cuò)誤的結(jié)果拔疚,調(diào)用reject函數(shù),在then函數(shù)的第二個(gè)作為參數(shù)的匿名函數(shù)中獲取錯(cuò)誤處理數(shù)據(jù)既荚。 這樣稚失,一個(gè)次完整的Promise調(diào)用就結(jié)束了。
三固以、.then()
then()方法執(zhí)行后會(huì)返回一個(gè)新的Promise實(shí)例墩虹。它有兩個(gè)參數(shù),分別為:Promise從pending變?yōu)閒ulfilled和rejected時(shí)的回調(diào)函數(shù)(第二個(gè)參數(shù)非必選)憨琳。這兩個(gè)函數(shù)都接受Promise對(duì)象傳出的值(data)作為參數(shù)诫钓。
語(yǔ)法
onCompleted(必傳參數(shù)):操作成功完成時(shí)要運(yùn)行的履行處理程序函數(shù)。
onRejected(選傳參數(shù)):操作被拒絕時(shí)要運(yùn)行的錯(cuò)誤處理程序函數(shù)篙螟。
Promise任務(wù)鏈
對(duì)于Promise的then()方法菌湃,then總是會(huì)返回一個(gè)Promise實(shí)例,因此你可以一直調(diào)用then遍略,形如p().then().then().then().then().then().....
1)如果then沒(méi)有傳入處理函數(shù)惧所,那么會(huì)返回一個(gè)繼承了上一個(gè)處理狀態(tài)的Promise對(duì)象
2)如果then傳入處理函數(shù),那么默認(rèn)返回一個(gè)fulfilled/resolved狀態(tài)的Promise對(duì)象
3)如果then傳入處理函數(shù)绪杏,通過(guò)處理函數(shù)顯示的return了一個(gè)新的Promise下愈,那么返回這個(gè)顯示的Promise對(duì)象
弊端:不易中途終止后續(xù)任務(wù)執(zhí)行
四、.catch()
處理rejected 的情況蕾久,與then的第二個(gè)參數(shù)onRejected相同
可以捕獲.catch以上的任一錯(cuò)誤(前提是:.then中的onRejected函數(shù)沒(méi)有做任何處理)
補(bǔ)充~:
1).catch與.then中的onRejected函數(shù)沖突势似,如果前面.then中出行了onRejected函數(shù),.catch將不會(huì)執(zhí)行僧著。
2).catch執(zhí)行后會(huì)返回一個(gè)Promise對(duì)象履因,且狀態(tài)默認(rèn)為fulfilled/resolved(與.then相似)
五、.all? ?
多任務(wù)處理
需要等(p1盹愚、p2)所有promise執(zhí)行完栅迄,才可以執(zhí)行then
六、.race
(p1皆怕、p2)只要有一個(gè)執(zhí)行完毅舆,就會(huì)執(zhí)行then