再回到事件監聽的程式碼中,可以在箭頭函式前添加async
,將其變成「非同步函式」,並且於呼叫函式前添加await
,以等待呼叫函式的回傳值,避免執行結果的順序,因為變更為非同步函式而有先後不同。
// 非同步函式及await的搭配組合
searchBtnSchedule.addEventListener("click", async () => {
console.log("🔍 查詢按鈕被點擊,開始獲取班表資料...");
await searchSchedule(); // 呼叫資料取得邏輯
});
初次接觸到非同步函式的概念,第一個問題是那是否有同步函式的概念,及兩者差異在哪。關此問題,可從字面上直接做理解
但非同步函式以不用等待執行結果,所換取到可同時接受不同指令及事件的後果,就是函式回傳的結果可能會因執行時間快慢,而與程式碼撰寫的順序有所不同,導致程式錯亂。此時,會在呼叫函式前面增加await
,以確保個在事件駐列中的函式,仍需等待前面的函式執行完成後,才繼續執行下一個函式,確保與程式碼順序相同。故在JavaScript中,相當常見到async
與await
的搭配組合。
非同步函式,在與後端聯繫的時候,相當常使用,如fetch()
。為了避免自後端抓取資料的時間過長,導致整個網頁需等待執行結果,須採用非同步函式。但同時又怕執行結果與程式碼結果順序錯亂,需要再搭配await
。