談談你對Promise的理解

一、Promise是什麼?

  • 理解

    •  抽象表達:

      • Promise 是一門新的技術(ES6 規範)

      • PromiseJS 中進行異步編程的新解決方案(備註:舊方案是單純使用回調函數

    •  具體表達:

      • 語法上來說: Promise 是一個構造函數

      • 功能上來說: promise 對象用來封裝一個異步操作並可以獲取其成功/失敗的結果值

  • promise 的狀態改變

    • pending 變為 resolved

    • pending 變為 rejected

    • 說明: 只有這 2 種, 且一個 promise 對象只能改變一次無論變為成功還是失敗, 都會有一個結果數據,成功的結果數據一般稱為 value, 失敗的結果數據一般稱為 reason

二、Promise 構造函數的基本用法

const p = new Promise((resolve, reject) => {
       if (...) {   // succeed
             resolve(result);        
       } else {     // fails
             reject(Error(errMessage));
       }
});

p.then(value => {
  console.log(value.toString())
},reason => {
  console.log(reason)
})

三、為什麼要用Promise?

  • 指定回調函數的方式更加靈活

    • 舊的: 必須在啟動異步任務前指定

    • promise: 啟動異步任務 => 返回 promie 對象 => 給 promise 對象綁定回調函數(甚至可以在異步任務結束後指定多個)

  • 支持鏈式調用, 可以解決回調地獄問題

    • 什麼是回調地獄?
      • 回調函數嵌套調用, 外部回調函數異步執行的結果是嵌套的回調執行的條件,格式上不斷地進行縮進。
    • 回調地獄的缺點?
      • 不便於閱讀

      • 不便於異常處理

    • 解決方案?
      • promise 鏈式調用
    • 終極解決方案?

      • async/await