天天看點

Promise的方法使用Promise的基本使用

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為狀态資料
})
           

細節

  1. 未決階段的處理函數是同步的,會立即執行
  2. thenable和catchable函數是異步的,就算是立即執行,也會加入到事件隊列中等待執行,并且,加入的隊列是微隊列
  3. pro.then可以隻添加thenable函數,pro.catch可以單獨添加catchable函數
  4. 在未決階段的處理函數中,如果發生未捕獲的錯誤,會将狀态推向rejected,并會被catchable捕獲
  5. 一旦狀态推向了已決階段,無法再對狀态做任何更改
  6. Promise并沒有消除回調,隻是讓回調變得可控

Promise的串聯

當後續的Promise需要用到之前的Promise的處理結果時,需要Promise的串聯

Promise對象中,無論是then方法還是catch方法,它們都具有傳回值,傳回的是一個全新的Promise對象,它的狀态滿足下面的規則:

  1. 如果目前的Promise是未決的,得到的新的Promise是挂起狀态
  2. 如果目前的Promise是已決的,會運作響應的後續處理函數,并将後續處理函數的結果(傳回值)作為resolved狀态資料,應用到新的Promise中;如果後續處理函數發生錯誤,則把傳回值作為rejected狀态資料,應用到新的Promise中。

後續的Promise一定會等到前面的Promise有了後續處理結果後,才會變成已決狀态

如果前面的Promise的後續處理,傳回的是一個Promise,則傳回的新的Promise狀态和後續處理傳回的Promise狀态保持一緻。