es6異步請(qǐng)求三個(gè)狀態(tài):1、pending(等待狀態(tài)),不會(huì)觸發(fā)then和catch;2、fulfill(滿足狀態(tài)),當(dāng)主動(dòng)回調(diào)了resolve時(shí),就處于該狀態(tài),并且會(huì)回調(diào)then();3、reject(拒絕狀態(tài)),會(huì)觸發(fā)后續(xù)的catch回調(diào)函數(shù)。
本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
Promise 是異步編程的一種解決方案:
1、主要用于異步計(jì)算
2、可以將異步操作隊(duì)列化,按照期望的順序執(zhí)行,返回符合預(yù)期的結(jié)果
3、可以在對(duì)象之間傳遞和操作 promise,幫助我們處理隊(duì)列
promise 有三個(gè)狀態(tài):
1、pending[待定]初始狀態(tài)
2、fulfilled[實(shí)現(xiàn)]操作成功
3、rejected[被否決]操作失敗
當(dāng) promise 狀態(tài)發(fā)生改變,就會(huì)觸發(fā) then()里的響應(yīng)函數(shù)處理后續(xù)步驟; 。
Promise 對(duì)象的狀態(tài)改變,只有兩promise 狀態(tài)一經(jīng)改變,不會(huì)再變種可能: 從 pending 變?yōu)?fulfilled
從 pending 變?yōu)?rejected。
這兩種情況只要發(fā)生,狀態(tài)就凝固了,不會(huì)再變了。
then和catch改變狀態(tài)的詳細(xì)情形
看下面一張圖
打印的是resolve狀態(tài),觸發(fā)resolve轉(zhuǎn)態(tài)的回調(diào)
看下面一張
報(bào)錯(cuò)則返回promise狀態(tài)的promise,觸發(fā)catch的回調(diào),只要有報(bào)錯(cuò),如果后面有
.then都不會(huì)執(zhí)行了只會(huì)執(zhí)行.catch
再看下面
沒有拋出錯(cuò)誤promise對(duì)象 ,還是resolve狀態(tài)
最后看下面一張
只要拋出錯(cuò)誤的promise對(duì)象 就是在reject狀態(tài)
用題目加強(qiáng)一下對(duì)promise轉(zhuǎn)態(tài)變化的理解
輸出下面1,2,3的順序
題目一: 按順序打印出 1 3 ,不會(huì)打印2因?yàn)閏atch不會(huì)被執(zhí)行(.then的promise是resolve狀態(tài) 不會(huì)執(zhí)行catch)
題目二:返回 1 2 3, 因?yàn)樵诖蛴?的時(shí)候拋出了錯(cuò)誤對(duì)象返回的是reject狀態(tài)下的promise,進(jìn)入到reject狀態(tài),但是.catch又是resolve狀態(tài)下的promise,所以又會(huì)執(zhí)行.then,最終 又返回的是一個(gè)resolve狀態(tài)下面的promise
Promise的all方法
Promise.all方法用于將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例。
Promise.all(iterator)Promise.all([ new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve('result1') },2000) }), new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve('result2') },1000) })]).then(results =>{ results[0] results[1] console.log(results)})
【推薦學(xué)習(xí):javascript高級(jí)教程】