JavaScript Async & Await – React 白話文運動 03

更新於 2024/11/22閱讀時間約 8 分鐘

歡迎來到 React 白話文運動系列的第三篇,今天我們將深入探討 JavaScript 中的非同步操作,並介紹兩個重要的關鍵字:Async 與 Await。在這篇文章中,我們將透過實例演示非同步操作的概念,以及如何使用 Promise、Fetch、Async 和 Await 來更有效地處理非同步程式碼。

前言

在現代的網頁開發中,非同步操作變得越來越重要。本文將從基本概念出發,深入探討非同步操作的原理以及如何使用先進的 JavaScript 語法來處理非同步情境。

此篇會講解非同步的 JavaScript

  1. 非同步
  2. Promise & Fetch
  3. Async & Await
  4. 建構Promise 物件

以上有關於中文翻譯,目前採用 MDN 官方中譯,有筆誤也歡迎讀者留言

非同步(Asynchronous)

非同步在開發中是不可或缺的概念,在之前的程式碼中目前都是同步的(Synchronous)概念,指的是說程式會依序執行。

然而在開發一個網頁的過程中,有時候需要執行非同步的(Asynchronous)的動作,例如:使用者按下表單送出,必須要等待資料傳送完畢後,獲得伺服器端回傳的資料,才能知道是否成功。

如果在伺服器回傳結果前,就直接透過 JavaScript 執行畫面成功與否,反而會是錯誤的。

而現代 JavaScript 中也有一些語法專門處理非同步的執行,包含接下來介紹的 Promise 以及 Async & Await。


Promise & Fetch

Promise

一個非同步的請求(request)通常有兩種結果,成功與失敗,不過實際上會有三種狀態,分別為完成(Fulfilled)、失敗(Rejected)以及等待中(Pending)。透過Promise物件,可以讓我們清楚執行了一個非同步的請求當前的狀態。

Fetch

在沒有 fetch 函數之前,要獲得一個 API 資料是相當麻煩的,可能需要寫超過二十行以上的程式碼,然而 ECMA 為了使其更加方便,新增了 fetch 語法,只要短短一、兩行就可以完成「獲取 API 」資料。

直接用一個api實例來做舉例,這邊網路上找了一個免費的api

https://api.thecatapi.com/v1/images/search

讀者如果直接輸入於瀏覽器中,可以看到一個回傳的物件,裡面包含了id、url、width、height

那要如何使用程式碼,獲得 api 資料呢?

 

fetch("https://api.thecatapi.com/v1/images/search")
.then(res=>res.json)
.then(console.log)
.catch(console.error)

這邊只要使用 fetch 函數,並且將網址當作引數(argument)傳入,透過 then 或是 catch 函數可以依序的執行接下來想要執行的程式。

以上述程式碼來說,先打了一隻 api,透過第一個 then 函數獲得回傳結果,透過第二個 then 函數印出訊息。最後透過 catch 函數,如果失敗則會印出失敗訊息。


Async & Await

JavaScript Async

另一個更常見也更泛用的非同步語法是使用 Async & Await非同步函式( Async Function),比起 Promise & Fetch,Async & Await 的語法更簡潔易懂,也比較符合我們的閱讀習慣。

如果以上面的 fetch then 改寫成 async & await 語法

const getCatData = async() => {
let res = await fetch("https://api.thecatapi.com/v1/images/search")
let { results } = await res.json()
console.log(results)
}
getCatData()
/*
[
{
id: "ac5",
url: "https://cdn2.thecatapi.com/images/ac5.jpg",
width: 565,
height: 551
}
]
*/

在函式中的第一行使用 async 關鍵字,告知電腦此為一個非同步函式,接下來只要在任何需要等待的非同步請求前面加上await關鍵字,即可完成此非同步函式。那麼我們要如何獲得失敗訊息呢?我們只要在 async & await 中,再加上 try & catch 語法,即可先執行 try 裡面的程式,並且在 catch 中處理 Promise 失敗的狀態

const getCatData = async() => {
try {
let res = await fetch("https://api.thecatapi.com/v1/images/search")
let { results } = await res.json()
console.log(results)
} catch (error) {
console.log(error)
}
}
getCatData()

建構Promise 物件

上上面已有提到Promise 總共有三種狀態,分別為完成(Fulfilled)、失敗(Rejected)以及等待中(Pending),不過以結果來說,最終都可以歸納為兩種結果,成功與失敗。因此在執行一個非同步函式,也可以將執行結果回傳,並且使用Promise物件去做儲存

const getCatData = () =>
new Promise((resolves, rejects) => {
const api = "https://api.thecatapi.com/v1/images/search"
const request = new XMLHttpRequest;
request.open("GET", api);
request.onload = () => {
request.status === 200 ?
resolves(JSON.parse(request.response).results) :
rejects(Error(request.statusText))
}
request.onerror = err => rejects(err);
request.send()
})


結語

這這篇講解了,非同步(Asynchronous)的概念以及一些實作,不過非同步本身是一個比較困難的概念,且其中的一些語法都是有點難度的,也歡迎讀者收藏此文章,未來都可以回過頭來複習此內容。 如果有任何建議與疑問也歡迎留言!如果喜歡此系列文章,請不吝於按下喜歡及分享,讓更多人看到唷~


備註

目前文章已移至 JavaScript ES6 – React 白話文運動 01

未來文章一併更新於此網站 Hogan.B Lab

並且包含多語系 繁體中文英文日文簡體中文

觀看分類:React 白話文運動其他系列


其他React文章參考

React 白話文運動 01-JavaScript ES6

React 白話文運動 02-JavaScript ES6 Object

為何大公司都使用Nx ? Monorepo工具 5 分鐘快速建置

你真的懂Monorepo? 5 分鐘帶你認識前端大型架構

Zustand 是什麼? React 前端狀態管理


希望能透過「React框架白話文運動」系列文章,利用口語化語表以及簡單的程式碼範例,能讓讀者更明白React的各種應用。 系列文章會講述以下: 1. 了解 ES6 JavaScript 語法 2. 了解 React 的運作原理 3. 了解 React 的狀態管理 4. 使用 React Hook管理狀態並且存取資料
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
今天會接續介紹 JS ES6 其他新穎的語法,物件解構(Object Destructuring)物件語法強化(Object Literal Enhancement)陣列解構(Array Destructuring)延展運算子(Spread Operator)。
在進入到 React 前端框架之前,幫讀者複習有關 JavaScript 的知識。此篇著重,JavaScript 的歷史、let & const & var 差異、樣板字面值( Template Literals )、箭頭函式( Arrow Function )JS ES6 一個非常重要的前置知識。
今天會接續介紹 JS ES6 其他新穎的語法,物件解構(Object Destructuring)物件語法強化(Object Literal Enhancement)陣列解構(Array Destructuring)延展運算子(Spread Operator)。
在進入到 React 前端框架之前,幫讀者複習有關 JavaScript 的知識。此篇著重,JavaScript 的歷史、let & const & var 差異、樣板字面值( Template Literals )、箭頭函式( Arrow Function )JS ES6 一個非常重要的前置知識。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
最近公司發放了2025年行事曆(以下為示意圖非實際行事曆): 看起來很正常的行事曆,但問題就出現在了週別計算。 歸納後某公司的規則如下: a. 1月1日那一週如果屬於今年的日數大於等於4日,則為第一週W1。 b. 1月1日那一週如果屬於今年的日數小於4日,則為去年最後一週W52或W5
Thumbnail
在JavaScript裡面,Async和Await應該是搜尋熱度最高的關鍵字了,因為他們相對複雜。我們一步步討論這件事的歷史 — 它們為什麼出現,解決了什麼問題。 JavaScript的Synchronous(同步) 首先我們必須了解JavaScript執行的基本原則 — synchrono
Thumbnail
工作上固定頻率會收到User提供的設定需求資訊,檔案大多為excel的格式.xlsx或.xls,需要擷取內容的參數資訊,轉換撰寫sql語法寫入資料庫進行操作。 既然格式都是固定的,何不動手寫個小工具,一鍵完成轉換呢?
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
async和await是建立在Promise基礎上的語法糖,讓我們可以用更直觀、更像同步程式的方式來寫非同步程式。
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
最近公司發放了2025年行事曆(以下為示意圖非實際行事曆): 看起來很正常的行事曆,但問題就出現在了週別計算。 歸納後某公司的規則如下: a. 1月1日那一週如果屬於今年的日數大於等於4日,則為第一週W1。 b. 1月1日那一週如果屬於今年的日數小於4日,則為去年最後一週W52或W5
Thumbnail
在JavaScript裡面,Async和Await應該是搜尋熱度最高的關鍵字了,因為他們相對複雜。我們一步步討論這件事的歷史 — 它們為什麼出現,解決了什麼問題。 JavaScript的Synchronous(同步) 首先我們必須了解JavaScript執行的基本原則 — synchrono
Thumbnail
工作上固定頻率會收到User提供的設定需求資訊,檔案大多為excel的格式.xlsx或.xls,需要擷取內容的參數資訊,轉換撰寫sql語法寫入資料庫進行操作。 既然格式都是固定的,何不動手寫個小工具,一鍵完成轉換呢?
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
async和await是建立在Promise基礎上的語法糖,讓我們可以用更直觀、更像同步程式的方式來寫非同步程式。
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)