React useEffect 在同一 Component 中的執行順序解析

更新於 發佈於 閱讀時間約 7 分鐘

軟體工程師職涯升級計畫啟動!立即預約職涯諮詢、履歷健檢或模擬面試👈,為您的加薪做好準備!

React 的 useEffect 是管理副作用(side effects)不可或缺的 Hook,但當你在同一個 component 中使用多個 useEffect 且包含非同步操作時,你可能會對它的執行順序產生疑問。

這篇文章將透過實例,說明 useEffect 的執行邏輯、非同步請求的順序,以及如果需要等所有 API response 都完成後再 render 畫面,該如何處理。


💡 問題情境:三個 useEffect + 非同步請求

jsx
複製編輯useEffect(() => {
console.log("1");
const fetchData = async () => {
try {
const result1 = await axios.get(url);
console.log(result1);
} catch (error) {
// error handle
}
};
fetchData();
}, []);

useEffect(() => {
console.log("2");
const fetchData = async () => {
try {
const result2 = await axios.get(url);
console.log(result2);
} catch (error) {
// error handle
}
};
fetchData();
}, []);

useEffect(() => {
console.log("3");
const fetchData = async () => {
try {
const result3 = await axios.get(url);
console.log(result3);
} catch (error) {
// error handle
}
};
fetchData();
}, []);

console.log("4");

🔍 執行順序預測與結果

當這段程式執行時,console log 的順序將會是:

scss
複製編輯4
1
2
3
(result1 或 result2 或 result3)

🧠 原因解析:

  1. console.log("4") 是在 render 階段同步執行,會優先被執行
  2. 三個 useEffect 都設為 [](只在 mount 時執行),React 會依照它們在程式碼中的宣告順序執行。
  3. 每個 useEffect 中的 fetchData 是非同步的,不會阻塞下一個 useEffect 的執行
  4. 三個 axios.get() 的回傳順序不保證,會根據 API 回應速度而定。

🚧 驚訝點:非同步請求不影響 useEffect 執行順序

這段邏輯的關鍵點在於:

即使第一個 useEffect 中的 API 還沒回來,第二、第三個 useEffect 依然照順序執行。

這代表:

useEffect 是依序排程副作用,但不會等待前一個 async 動作完成後才進行下一個。


✅ 若要等待三個 API 都完成再繼續:使用 Promise.all

有些情況下,我們需要確保所有請求完成後再執行下一步(例如:組合顯示資料、切換 loading 狀態等)。此時應該整合三個請求為一個 Promise.all

jsx
複製編輯useEffect(() => {
const fetchData = async () => {
try {
const [result1, result2, result3] = await Promise.all([
axios.get(url1),
axios.get(url2),
axios.get(url3)
]);
console.log(result1, result2, result3);
// ✅ 所有資料準備完成後可更新畫面或取消 loading
} catch (error) {
// error handle
}
};
fetchData();
}, []);
  • Promise.all 會同時發出所有請求,並在全部都成功回應後才進入 try 區塊的下一行。
  • 若其中任一請求失敗(例如 404),將直接進入 catch 區塊。

⚠️ 小補充:try...catch 不處理 HTTP 內部錯誤狀態

Axios 的 catch 只會捕捉非 2xx 的 HTTP 錯誤(如 404、500),但若 API response 是 200,卻仍表示失敗(如 status: "error"),那就需要你自行處理:

js
複製編輯if (result.data.status === "ok") {
// success logic
} else if (result.data.status === "error") {
// handle API internal error
}

📌 小結

  • 多個 useEffect 在同一個 component 中,會依照宣告順序依序執行,但其中的非同步邏輯彼此不會等待。
  • 非同步資料的回傳順序無法保證,需使用 Promise.all 或其他控制流程方法來同步。
  • 若有複數 API 的成功與失敗狀態需處理,記得區分 HTTP 錯誤與業務邏輯錯誤。

📚 延伸閱讀建議


🧠 有任何想法或補充,歡迎留言討論,也可以把這篇文章分享給剛接觸 useEffect 的朋友,一起解開 React 非同步流程的迷霧!

留言
avatar-img
留言分享你的想法!
avatar-img
跨越國界的程式人生
2會員
32內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
2025/07/17
這篇文章深入淺出地介紹 HTTP 快取(Cache)的概念、類型(私有和共用快取)、常見的 Cache-Control 設定,以及其在提升網站效能和使用者體驗方面的作用。文章包含圖表和流程圖,並提供額外的學習資源連結,方便讀者更深入瞭解 HTTP 快取機制。
Thumbnail
2025/07/17
這篇文章深入淺出地介紹 HTTP 快取(Cache)的概念、類型(私有和共用快取)、常見的 Cache-Control 設定,以及其在提升網站效能和使用者體驗方面的作用。文章包含圖表和流程圖,並提供額外的學習資源連結,方便讀者更深入瞭解 HTTP 快取機制。
Thumbnail
2025/07/17
現代Web架構前後端分離盛行,但增加了前端與後端API互動的風險。本文介紹Proxy(代理伺服器)如何作為中介層,解決API網址暴露、跨來源請求(CORS)問題和權限控管等挑戰,提升API使用的安全性和彈性。文中包含Proxy的應用場景、Node.js實作範例,以及安全性考量。
Thumbnail
2025/07/17
現代Web架構前後端分離盛行,但增加了前端與後端API互動的風險。本文介紹Proxy(代理伺服器)如何作為中介層,解決API網址暴露、跨來源請求(CORS)問題和權限控管等挑戰,提升API使用的安全性和彈性。文中包含Proxy的應用場景、Node.js實作範例,以及安全性考量。
Thumbnail
2025/07/14
本篇文章深入探討 RESTful API 與 GraphQL 兩種主流 API 設計風格的優缺點、適用場景及實作方式,並提供選擇建議,協助開發者根據專案需求做出明智的選擇。文章也涵蓋了 API 快取機制、權限控制、以及常見挑戰等面向。
Thumbnail
2025/07/14
本篇文章深入探討 RESTful API 與 GraphQL 兩種主流 API 設計風格的優缺點、適用場景及實作方式,並提供選擇建議,協助開發者根據專案需求做出明智的選擇。文章也涵蓋了 API 快取機制、權限控制、以及常見挑戰等面向。
Thumbnail
看更多
你可能也想看
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
Function的使用方式
Thumbnail
Function的使用方式
Thumbnail
JavaScript30 傳送門:https://javascript30.com/ 挑戰5透過玩弄 flex-grow 屬性來操作網頁裡的卡片效果,看別人的成果:yhabib.github.io 本次學習心得: 製造過度效果延遲的方法:transition-delay V.S
Thumbnail
JavaScript30 傳送門:https://javascript30.com/ 挑戰5透過玩弄 flex-grow 屬性來操作網頁裡的卡片效果,看別人的成果:yhabib.github.io 本次學習心得: 製造過度效果延遲的方法:transition-delay V.S
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
React Marquee是一個輕量級的React library,可以在網頁上創建流暢的跑馬燈效果。本文提供快速教學和講解,教大家如何安裝、使用React跑馬燈library官方網站。另外,也分享了額外的資源和相關教學文章。希望透過以上講解和影片教學,能幫助大家瞭解這個library。
Thumbnail
React Marquee是一個輕量級的React library,可以在網頁上創建流暢的跑馬燈效果。本文提供快速教學和講解,教大家如何安裝、使用React跑馬燈library官方網站。另外,也分享了額外的資源和相關教學文章。希望透過以上講解和影片教學,能幫助大家瞭解這個library。
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News