2016-04-14 85 views
0

我正在用Redux構建一個包含使用計時器的庫。我有一個動作創建者發送一個START_TIMER事件,還應該在計時器對象上調用start。代碼如下所示:Redux中的回放操作

// thunk action creator 
 
const startTimer =() => (dispatch, getState) => { 
 
    
 
    if (!getState().timer.isRunning) 
 
    externalTimerObject.start() 
 

 
    dispatch({ 
 
    type: 'START_TIMER' 
 
    }) 
 
    
 
}

有兩個問題,我試圖解決:

  1. 如果我想記錄我的行動到數據庫或這樣的localStorage我可以重播它們以達到一致的應用程序狀態,即使rootState.timer.isRunning爲真,我的計時器對象也不會運行。

  2. 條件if (!getState().timer.isRunning)要求我知道掛載根狀態timer的位置。由於我將它作爲庫構建,所以我不能認爲timer將始終直接掛載到根狀態。

回答

1

如果我想記錄我的行動到數據庫或localStorage的,這樣我可以重播他們得到一個一致的應用程序狀態,那麼即使rootState.timer.isRunning是真實的,我的計時器對象不會正在運行。

我認爲這實際上是正確的設計。當您重現記錄的日誌時,您希望在發生的操作方面,發生的所有事情都與之前發生的一樣發生在之間。例如,在回放操作的同時,您可能不希望從計算機中觸發真正的AJAX請求,而是重播過去在該用戶會話期間分發的記錄的AJAX響應。

我認爲計時器屬於同一類別:從Redux的角度來看,行動歷史記錄描述了發生的副作用「結果」,並且重播動作應該足以讓您的應用程序進入相同即使這些副作用實際上並沒有再次發生。

條件if(!getState()。timer.isRunning)要求我知道掛載根狀態計時器的位置。由於我將它構建爲一個庫,我不能認爲定時器總是會直接掛載到根狀態。

如果你正在建立一個庫,你也可能不應該依賴於可用的thunk中間件。你似乎在你的動作創作者中依賴它。如果不理解你的確切用例,很難多說。