Promise的基本使用
const pro = new Promise((resolve, reject)=>{
// 未決階段的處理
// 通過調用resolve函數将Promise推向已決階段的resolved狀态
// 通過調用reject函數将Promise推向已決階段的rejected狀态
// resolve和reject均可以傳遞最多一個參數,表示推向狀态的資料
})
pro.then(data=>{
//這是thenable函數,如果目前的Promise已經是resolved狀态,該函數會立即執行
//如果目前是未決階段,則會加入到作業隊列,等待到達resolved狀态後執行
//data為狀态資料
}, err=>{
//這是catchable函數,如果目前的Promise已經是rejected狀态,該函數會立即執行
//如果目前是未決階段,則會加入到作業隊列,等待到達rejected狀态後執行
//err為狀态資料
})
細節
- 未決階段的處理函數是同步的,會立即執行
- thenable和catchable函數是異步的,就算是立即執行,也會加入到事件隊列中等待執行,并且,加入的隊列是微隊列
- pro.then可以隻添加thenable函數,pro.catch可以單獨添加catchable函數
- 在未決階段的處理函數中,如果發生未捕獲的錯誤,會将狀态推向rejected,并會被catchable捕獲
- 一旦狀态推向了已決階段,無法再對狀态做任何更改
- Promise并沒有消除回調,隻是讓回調變得可控
Promise的串聯
當後續的Promise需要用到之前的Promise的處理結果時,需要Promise的串聯
Promise對象中,無論是then方法還是catch方法,它們都具有傳回值,傳回的是一個全新的Promise對象,它的狀态滿足下面的規則:
- 如果目前的Promise是未決的,得到的新的Promise是挂起狀态
- 如果目前的Promise是已決的,會運作響應的後續處理函數,并将後續處理函數的結果(傳回值)作為resolved狀态資料,應用到新的Promise中;如果後續處理函數發生錯誤,則把傳回值作為rejected狀态資料,應用到新的Promise中。
後續的Promise一定會等到前面的Promise有了後續處理結果後,才會變成已決狀态
如果前面的Promise的後續處理,傳回的是一個Promise,則傳回的新的Promise狀态和後續處理傳回的Promise狀态保持一緻。