2016-04-14 9 views
0

私はReduxでタイマーの使用を含むライブラリを構築しています。私はSTART_TIMERイベントをディスパッチするアクションクリエイターを持っていますが、タイマーオブジェクトにはstartも呼び出す必要があります。Reduxでのアクションの再生

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

 
    dispatch({ 
 
    type: 'START_TIMER' 
 
    }) 
 
    
 
}

私が解決しようとしている二つの問題があります:私は、データベースやのlocalStorageに自分の行動を記録したい場合は

  1. は、コードは次のようになりますたとえrootState.timer.isRunningがtrueであっても、私のタイマオブジェクトは実行されません。

  2. 条件付きif (!getState().timer.isRunning)は、ルート状態のどこにtimerがマウントされているかを知る必要があります。私はこれをライブラリとして構築しているので、timerは常にルート状態に直接マウントされるとは思いません。

答えて

1

私は一貫性のあるアプリケーションの状態に到達するためにそれらを再生できるように、データベースまたはのlocalStorageに自分の行動を記録したい場合は、rootState.timer.isRunningがtrueの場合でも、私のタイマーオブジェクトはしません走っている。

これは実際には設計上正しいと思います。記録されたログを再現するときは、生成された操作に関しての前に起こったことがすべて正確に起こるようにしてください。

たとえば、アクションを再生している間に実際のAJAXリクエストをコンピュータから起動するのではなく、過去にそのユーザーセッション中にディスパッチされたAJAX応答を再生する必要があります。

私はタイマーが同じカテゴリーに入ると思う:ビューのReduxの点から、行動履歴は、副作用の「結果として」何が起こったのかを説明し、アクションを再生すると、同じにあなたのアプリを取得するのに十分でなければなりませんたとえそれらの副作用が実際に再び発射されなかったとしても。

if(!getState()。timer.isRunning)は、ルートステートタイマーがどこにマウントされているかを知る必要があります。私はこれをライブラリとして構築しているので、タイマーが常にルート状態に直接マウントされることは想定できません。

ライブラリを構築する場合は、利用可能なサンドウィッチミドルウェアに依存しないようにすることもできます。あなたがアクションクリエイターに頼っているようです。あなたの正確なユースケースを理解することなく、さらに言い表すのは難しいです。

関連する問題