async, await

asyncarrow-up-right 函式被呼叫時,它會回傳一個 Promise。如果該 async 函式回傳了一個值,Promise 的狀態將為一個帶有該回傳值的 resolved。如果 async 函式拋出例外或某個值,Promise 的狀態將為一個帶有被拋出值的 rejected。

async 函式內部可以使用 awaitarrow-up-right 表達式,它會暫停此 async 函式的執行,並且等待傳遞至表達式的 Promise 的解析,解析完之後會回傳解析值,並繼續此 async 函式的執行。

async function getData () {
  let resolveValue = await <Promise>
}
circle-info

Async function / Await 深度介紹| 卡斯伯Blog - 前端arrow-up-right

promise 函式呼叫時可以使用 then 來接收 resolve 的結果,當要串接兩個 promise 函式時可以使用 return 來做 “鏈接”。

基於 Promise 的方法相當單純,就是不斷的呼叫 Promise 函式以及使用 then 來進行鏈接,Promise 可以解決過巢及串接 callback function 語法不一致等問題,但它依然在 JS 的同步語言中插入了一段非同步的片段。

async 函式改寫方式如下:

  1. 定義非同步函式(async function

  2. 透過 await 暫停 promiseFn,直到回傳後再繼續向下

async function getData() {
  const data1 = await promiseFn(1); // 因為 await,promise 函式被中止直到回傳
  const data2 = await promiseFn(2);
  console.log(data1, data2); // 1, 成功 2, 成功
}
getData();

結果與使用 then 是一致的,但就結構上更加平整,在 這個函式中都是以 “同步“ 的方式運行,不會產生同步、非同步程式碼混合的狀況。

  • 在 async 和 await 中的錯誤處理是使用 try...catch...

範例比較

用then 寫法與async/await 寫法

  • 註: async的最後如果有return也是可以用demo.than接值, 另外也可以用catch 接錯誤 (跟原概念一樣)

triangle-exclamation

Last updated