解析Promise解決異步回調(diào)
Promise是ES6語法中新增的一個(gè)標(biāo)準(zhǔn)內(nèi)置對(duì)象,它代表了一個(gè)異步操作的最終完成或者失敗,能夠把異步操作最終的成功返回值或者失敗原因和相應(yīng)的處理函數(shù)關(guān)聯(lián)起來,是異步“回調(diào)地獄”的解決方案之一。
?當(dāng)我們執(zhí)行一個(gè)異步的行為的時(shí)候,我們需要在一個(gè)異步行為執(zhí)行完畢之后做一些事情,那么,我們是沒有辦法提前預(yù)知這個(gè)異步行為是什么時(shí)候完成的,我們就只能以回調(diào)函數(shù)的形式來進(jìn)行,比如我們需要通過ajax請(qǐng)求一個(gè)數(shù)據(jù),根據(jù)ajax返回的結(jié)果執(zhí)行不同的代碼,但是我們不知道ajax對(duì)象什么時(shí)候能獲取到返回結(jié)果,就需要使用回調(diào)函數(shù),看下面的代碼:
如果采用上面的調(diào)用方式,先調(diào)用getData獲取數(shù)據(jù)以后直接調(diào)用showData顯示數(shù)據(jù),那么document.body.innerHTML = null,因?yàn)榇藭r(shí)data還沒有獲取到數(shù)據(jù),請(qǐng)求時(shí)異步的,我們需要在請(qǐng)求完成的時(shí)候調(diào)用showData才行,也就是像下面這樣調(diào)用
?當(dāng)一個(gè)回調(diào)函數(shù)嵌套一個(gè)回調(diào)函數(shù)的時(shí)候,就會(huì)出現(xiàn)一個(gè)嵌套結(jié)構(gòu),當(dāng)嵌套的多了就會(huì)出現(xiàn)回調(diào)地獄的情況, 比如我們發(fā)送三個(gè) ajax 請(qǐng)求,第一個(gè)正常發(fā)送,第二個(gè)請(qǐng)求需要第一個(gè)請(qǐng)求的結(jié)果中的某一個(gè)值作為參數(shù),第三個(gè)請(qǐng)求需要第二個(gè)請(qǐng)求的結(jié)果中的某一個(gè)值作為參數(shù)
Promise是一個(gè)對(duì)象,這個(gè)對(duì)象有三個(gè)狀態(tài):
待定(pending):初始狀態(tài),既沒有成功,也沒有失敗,表示異步任務(wù)正在進(jìn)行中
成功(fulfilled):異步任務(wù)執(zhí)行完畢,變成成功狀態(tài)
失敗(rejected):異步任務(wù)執(zhí)行完畢,變成失敗狀態(tài)
下面就帶大家創(chuàng)建一個(gè)Promise對(duì)象