2016-04-14 13 views
0

Ich baue eine Bibliothek mit Redux, die einen Timer verwendet. Ich habe einen Aktionsersteller, der ein START_TIMER Ereignis auslöst und sollte auch start auf einem Timer-Objekt aufrufen. Der Code sieht wie folgt aus:Wiederholen von Aktionen in Redux

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

 
    dispatch({ 
 
    type: 'START_TIMER' 
 
    }) 
 
    
 
}

Es gibt zwei Probleme Ich versuche zu lösen:

  1. Wenn ich möchte, dass meine Handlungen in eine Datenbank oder local so loggt dass ich sie wiedergeben kann, um zu einem konsistenten App-Status zu kommen, selbst wenn rootState.timer.isRunning wahr ist, wird mein Timer-Objekt nicht ausgeführt.

  2. Die bedingte if (!getState().timer.isRunning) erfordert, dass ich weiß, wo im Stammzustand timer montiert ist. Da ich dies als eine Bibliothek baue, kann ich nicht davon ausgehen, dass timer immer direkt in den Stammzustand eingehängt wird.

Antwort

1

Wenn ich möchte, dass meine Handlungen in einer Datenbank oder local anmelden, damit ich sie auch dann in einen konsistenten Zustand App bekommen wiedergeben kann, wenn rootState.timer.isRunning wahr ist, wird mein Timer-Objekt nicht in Betrieb sein.

Ich denke, das ist eigentlich richtig durch Design. Wenn Sie ein aufgezeichnetes Protokoll reproduzieren, möchten Sie, dass alles passiert genau wie es vor in Bezug auf die produzierten Aktionen passiert ist.

Anstatt beispielsweise die echten AJAX-Anforderungen von Ihrem Computer auszulösen, während Sie Aktionen wiederholen, möchten Sie wahrscheinlich die aufgezeichneten AJAX-Antworten wiedergeben, die während dieser Benutzersitzung in der Vergangenheit gesendet wurden.

Ich denke, Timer in die gleiche Kategorie fällt: von der Redux Sicht Aktion Geschichte beschreibt was „als Folge“ von Nebenwirkungen geschehen ist, und sollten die Aktionen Wiedergabe genug sein, um Ihre App in die gleiche zu bekommen Zustand, selbst wenn diese Nebenwirkungen nicht tatsächlich wieder ausgelöst haben.

Die bedingte if (! GetState(). Timer.isRunning) verlangt, dass ich weiß, wo im Wurzelzustand Timer montiert ist. Da ich dies als eine Bibliothek baue, kann ich nicht davon ausgehen, dass der Timer immer direkt in den Root-Zustand eingebunden wird.

Wenn Sie eine Bibliothek erstellen, sollten Sie wahrscheinlich auch nicht davon abhängig sein, dass die Thunk-Middleware verfügbar ist. Es scheint, als ob Sie in Ihrem Action Creator darauf angewiesen sind. Es ist schwer, mehr zu sagen, ohne Ihren genauen Anwendungsfall zu verstehen.