javascript中優雅的處理async和await異常

  • 2019 年 10 月 8 日
  • 筆記

let handler = async function(needErr) {      return new Promise((resolve, reject) => {          if (needErr) {              reject(new Error('執行失敗,給出錯誤'))          } else {              resolve('執行成功,沒有報錯')          }      })  }    let run = async function() {      let result = await handler(false).catch();      console.log(result);      result = await handler(true).catch();      console.log(result);  }    run();

輸出:

執行成功,沒有報錯  (node:3428) UnhandledPromiseRejectionWarning: Error: 執行失敗,給出錯誤

async函數總是返回promise實例

無論是return了Promise, 還是內部調用了await, 就算什麼也沒做,它也返回promise; 一個函數,只要被標記了async,那麼它就返回Promise對象 所以上面的handler函數返回的是一個promise實例

如果一個 async 函數返回的是一個 reject 的 Promise,那麼這個 Promise 依然會繼續被 reject。

這行代碼:let result = await handler(false).catch(); 返回的是resolve狀態的promise result = await handler(true).catch(); 返回的是reject狀態的promise await一個resolve狀態的promise,無論有沒有catch,都直接得到結果 await一個reject狀態的promise,catch會抓住異常,返回異常結果