簡體   English   中英

Redux如何保證沒有競爭條件?

[英]How can Redux guarantee no race condition?

我最近了解了Redux。
我很好理解這個概念,但我在官方文檔中沒有弄清楚這一行:

因為所有的變化都是集中的,並且按照嚴格的順序逐個發生,所以沒有細微的競爭條件需要注意。

Redux如何保證不會出現微妙的競爭條件?

實際上,我可以想象這種情況(按順序):

  1. 某些組件調度ACTION_TYPE_1。
  2. 某些組件調度ACTION_TYPE_2。
  3. ACTION_CREATOR_1進行ajax調用以獲取一些數據。
  4. ACTION_CREATOR_2進行ajax調用以獲取一些數據。
  5. ACTION_CREATOR_2 ACTION_CREATOR_1 之前處理抓取的數據。
  6. 由於這種競爭條件可能會出現奇怪的行為?

因此,動作創建者調度將按順序應用,但這些動作創建者的實現可能不會按順序應用,可能導致非確定性代碼。

如何弄清楚報價?

我可以理解,對於Redux,有一種關於調度操作歷史的跟蹤 (有助於在運行時理解程序工作流),但這些操作的實際實現又如何呢?

@DanAbramov本人,我剛剛遇到了這一點 ,非常有意義。

我認為這很好地解答了我的OP。

關鍵是只要調度操作保持同步 (盡管創建者內部進程可能根本不同步),通過建立和記錄很容易快速找出競爭條件(或其他有關非確定性的問題)派遣行動的歷史。
特別是很容易重現“怪異”狀態,然后弄清楚如何避免它(如事件采購 )。

沒有任何同步和可見的時間點,很難掌握發生的事情; 這就是Redux帶來好處的原因。

正如文檔所述,Redux並沒有避免競爭條件,但確實減少了極其微妙 (難以分析)的競爭條件。

  1. Javascript是線程安全的,因此2個函數不能同時運行。

  2. Redux不了解異步操作,它只關心當前狀態,調度給它的事件以及如何在給定事件的情況下將當前狀態轉換到某個其他狀態。

  3. 因此,確保行動調度順序是您的責任,這不是Redux的責任。

  4. 如果有兩個事件,X和Y,並且您希望在處理X之前阻止處理Y,那么您可以使用某些狀態屬性在Redux狀態中跟蹤它。 因此,您可以輕松地防止在處理X之前處理Y.

  5. 對於異步操作和人們可能希望應用的錯誤處理有太多不同的要求。 因此很難為你所談論的“競爭條件”提供一般解決方案。

  6. 設計您的系統,查找所有邊緣案例,並為您可以擁有的每個邊緣案例創建新的事件/事件名稱/事件處理。 然后在redux減速器中處理它們,進行適當的狀態轉換。 在Web應用程序中,沒有什么是致命錯誤(要求用戶刷新瀏覽器不是一個好的UI / UX),因此您必須從每個可能的邊緣情況中恢復,因此拋出錯誤沒有多大意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM