一赋续、什么是Promise?
Promise是異步編程的一種解決方案,將異步操作以同步操作的流程表達(dá)出來另患,避免了層層嵌套的回調(diào)函數(shù)纽乱,是為了解決異步處理回調(diào)地獄而產(chǎn)生的
Promise構(gòu)造函數(shù)是同步執(zhí)行的,then 方法是異步執(zhí)行的昆箕,所以Promise創(chuàng)建后里面的函數(shù)會立即執(zhí)行鸦列,構(gòu)造函數(shù)中的resolve和reject只有第一次執(zhí)行有效,鹏倘,也就是說Promise狀態(tài)一旦改變就不能再變
async函數(shù)返回一個Promise對象薯嗤,可以使用then方法添加回調(diào)函數(shù),函數(shù)內(nèi)部使用await來表示異步纤泵,async函數(shù)只有從await向下才是異步的開始
它有三個狀態(tài):pedding:初始狀態(tài)骆姐,既不代表成功也不代表失敗
? ? ? ? ? ? ? ? ? ? ? ? ?fulfilled:成功狀態(tài)
? ? ? ? ? ? ? ? ? ? ? ? ?rejected:失敗的狀態(tài)
兩個過程:pedding---->fulfilled、pedding---->rejected
缺點:
①無法取消Promise,一旦新建它就會立即執(zhí)行,無法中途取消。
②如果不設(shè)置回調(diào)函數(shù),promise內(nèi)部拋出的錯誤,不會反應(yīng)到外部玻褪。
③當(dāng)處于pending狀態(tài)時,無法得知目前進(jìn)展到哪一個階段(剛剛開始還是即將完成)肉渴。
二、Promies的靜態(tài)方法
1.Promise.resolve()函數(shù)被執(zhí)行時, 會將promise的狀態(tài)從 pending 改成 fulfilled 成功
2.Promise.reject()函數(shù)被執(zhí)行時, 會將promise的狀態(tài)從pending 改成 rejected 失敗
new Promise((resolve, reject) => {
reject()? ? ?//Promise.reject()---->??rejected?失敗?
//? resolve()??Promise.resolve()----->fulfilled?成功
})
3.Promise.all([promise1, promise2, promise3])?等待原則, 是在所有promise都完成后執(zhí)行, 可以用于處理一些并發(fā)的任務(wù)带射,如果Promise實例都進(jìn)入Fulfilled狀態(tài)黄虱,Promise.all返回的實例才會變成Fulfilled狀態(tài)并將Promise實實例數(shù)組的所有返回值組成一個數(shù)組,傳給Promise.all返回實例的回調(diào)函數(shù)庸诱;如果有某一個或者多個實例進(jìn)入rejected狀態(tài)捻浦,Promise.all返回的實例會立即變成Rejected狀態(tài)并將第一個rejected的實例返回值傳遞給Promise.all返回實例的回調(diào)函數(shù)。
4.Promise.race([promise1, promise2, promise3]) 賽跑, 競速原則, 只要三個promise中有一個滿足條件, 就會執(zhí)行.then(用的較少)桥爽,先執(zhí)行到成功就返回成功的狀態(tài)朱灿,返回失敗就是失敗狀態(tài)
三、Promise的實例方法
1.Promise.then(),此方法接收兩個參數(shù)onResolve和onReject,分別代表當(dāng)前Promise對象的成功和失敗
2.Promise.catch()钠四,當(dāng)pedding變?yōu)閞ejected時會進(jìn)入catch盗扒,來對錯誤進(jìn)行處理
四、reject和catch處理上有什么不同缀去?
①reject是用來拋出異常侣灶,catch用來處理異常
②reject是Promise的方法,而catch是Promise實例的方法
③reject后面的東西一定會進(jìn)入.then中的第二個回調(diào)缕碎,如果then中沒有寫第二個回調(diào)褥影,則進(jìn)入catch
④網(wǎng)絡(luò)異常,會直接進(jìn)入catch而不會進(jìn)入then的第二個回調(diào)
五咏雌、手寫一個Promise
//Promise構(gòu)造函數(shù)的兩個方法resolve,reject,分別代表成功和失敗
var Promise=new Promise((resolve,reject)=>{
if(操作成功){
resolve(value)
}else{
reject(error)
)
// .then第一個回調(diào)執(zhí)行成功回調(diào)凡怎,第二個是失敗回調(diào)
Promise.then( function (value) {
//成功 },function(value){
//失敗 } )