什么是promise怔毛?
promise 表示的是一個未來即將發(fā)生事情渠缕。它的構(gòu)建形式為
new Promise(/**executor **/function(resolve,rejected){
//ajax
if(success){
resolve(successResult)
}else{
rejected(errorInfo)
}
})
當promise創(chuàng)建的時候就會立即executor呈昔,這時候promise處于pending狀態(tài)
當某個異步操作成功執(zhí)行后,通過調(diào)用resolve可以變更promise的狀態(tài)為fulfilled粥惧。
當某個異步操作執(zhí)行失敗后喘鸟,通過調(diào)用reject變更promise的狀態(tài)為rejected匆绣。
這里的reject 和resolve 都是內(nèi)置的函數(shù),通過他們可以修改promise狀態(tài)什黑。如果不掉用則狀態(tài)無法變更(處于pending狀態(tài))
當promise狀態(tài)變更后又會觸發(fā)其鏈式方法的調(diào)用犬绒。
new Promise(function(resolved,reject){
if(success)
resolved(222)
else
reject(333);
}).then((res)=>{console.log(res)}).catch(e=>{console.log(e)})
如上述代碼所示:
當處于reject狀態(tài)(reject方法被調(diào)用)catch方法會被調(diào)用,then方法(無則不會兑凿,
當resolve被調(diào)用則then方法會執(zhí)行,而catch則不會茵瘾。所以promise又有一種狀態(tài)機的即視感礼华。
這里要補充一下then 方法全部參數(shù)如下所示:
Promise.prototype.then(onFulfilled, onRejected)
所以如果你有傳入onRejected參數(shù),那么出現(xiàn)異常的時候then也會被執(zhí)行拗秘,即OnRejected被調(diào)用圣絮。
promise狀態(tài)變更詳細狀態(tài)如下所示:
await async 與promise 的應用
如下typescript代碼所示,過去我們使用setTimeout做延時任務雕旨,其書寫方式相對麻煩需要傳入回調(diào)函數(shù)并出現(xiàn)多重嵌套“缃常現(xiàn)在可以通過async await 以及promise 解決這個問題
async function timeout(time:Number) {
return new Promise(resolve => setTimeout(resolve, time));
}
try{
await timeout(5000);
}catch(error){
....
}
async表示一個異步方法,它必須返回promise凡涩,而await 表示等待promise狀態(tài)發(fā)生變更后才繼續(xù)執(zhí)行后續(xù)語句(即變?yōu)閞ejected or fullfilled)棒搜。如果處于rejected則會拋出異常用catch塊捕獲,如果為fullfilled則正常執(zhí)行活箕。
參考: