--- tags: Node.js 直播班 - 2022 春季班 --- # Day5:非同步概念、async await ## 非同步概念、async await async 及 await 是執行非同步函式的一種寫法,此寫法可以讓非同步函式在閱讀上更接近同步函式 在非同步函式前加上 `async` 關鍵字,執行此函式時回傳值就會被轉為一個 Promise 在 `async` 非同步函式中,使用 `await` 接收回傳的結果,它會暫停此 async 函式的執行,並且等待 Promise 的解析,解析完之後會回傳解析值,並繼續此 async 函式的執行 也就是說在未等待到結果回傳前,不會執行到 `await` 之後的程式 範例: ```javascript= function resolveAfter2Seconds(x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 2000); }); } async function add1(x) { const a = await resolveAfter2Seconds(20); const b = await resolveAfter2Seconds(30); return x + a + b; } ``` ### 參考資源 [Async function / Await 深度介紹 | 卡斯伯 Blog - 前端,沒有極限](https://www.casper.tw/development/2020/10/16/async-await/) [利用 async 及 await 讓非同步程式設計變得更容易 | MDN](https://developer.mozilla.org/zh-TW/docs/conflicting/Learn/JavaScript/Asynchronous/Promises) [async、await 再升級](https://courses.hexschool.com/courses/1670869/lectures/38886995)(章節影片) ### 題目(將答案寫在 CodePen 並提交至回報區) 流程: 批改作業 → 檢查獎勵 → 給予獎勵 → 退學或懲罰 ```JavaScript // 批改作業 function correctTest(name) { return new Promise((resolve, reject) => { setTimeout(() => { const score = Math.round(Math.random()*100); if(score >= 60) { resolve({ name, score }) } else { reject("您已達退學門檻") } }, 2000) }) } // 檢查獎勵 function checkReward(data) { return new Promise((resolve, reject) => { setTimeout(() => { if(data.score >= 90) { resolve(`${data.name} 獲得電影票`); } else if (data.score >= 60 && data.score < 90) { resolve(`${data.name} 獲得嘉獎`); } else { reject(`您沒有獎品`) } }, 2000) }) } ``` 將以下這段程式碼改寫為 async await 的寫法 ```javascript= correctTest("小明") .then(data => checkReward(data)) .then(reward => console.log(reward)) .catch(error => console.log(error)) ``` 回覆範例: ```javascript= const init = async function() { try{ /* 在此填寫答案 */ const correct = await correctTest('小明') const reward = await checkReward('correct') console.log(reward) }catch(err){ console.log(err) } init(); ```