[Q&A] React 18 useEffect
在 Strict Mode 下執行兩次,導致 join
被重複呼叫
#132
Labels
question
Further information is requested
useEffect
在 Strict Mode 下執行兩次,導致 join
被重複呼叫
#132
問題描述
在 React 18 開發環境(StrictMode 啟用)下,useEffect 會執行兩次,導致以下執行順序:
由於 handleLeave 是非同步函式,在 handleLeave 執行完成前,React 就再次執行 joinRoom,導致「重複進房」錯誤。
雖然程式中已經有 isJoining 和 isLeaving 來避免重複執行,但在 StrictMode 的雙重執行下,它們的狀態更新可能還沒完成,就觸發了第二次 joinRoom,導致檢查條件失效。
重現步驟
useEffect
中執行joinRoom
,並在 Cleanup 時執行handleLeave
:joinRoom
和handleLeave
內容如下:joinRoom
被執行兩次handleLeave
在兩次joinRoom
之間執行handleLeave
還沒完成 就執行第二次joinRoom
,導致第一次joinRoom
還未結束時,第二次joinRoom
被觸發,出現「重複進房」錯誤預期行為
第二次
joinRoom
執行時,handleLeave
應該已經完全完成、或是已取消第一次joinRoom
的呼叫,不會出現重複進房錯誤環境資訊
疑問
joinRoom
是否正在執行? 例如類似isJoining
的內建狀態,讓我們能避免重複呼叫?joinRoom
和handleLeave
不會發生競態問題?The text was updated successfully, but these errors were encountered: