2017-03-03 11 views
11

Wir haben eine ReactNative App, die redux, redux-persist und eine HeadlessJS Aufgabe verwendet. Diese Aufgabe muss Zugriff auf das Geschäft haben. Da die Aufgabe ausgelöst wird, ohne die gesamte App zu booten (und daher standardmäßig keinen Zugriff hat), dachten wir, wir könnten einfach den Speicher innerhalb der Aufgabe erstellen, so dass er durch redux-persist rehydriert würde. Es stellt sich jedoch heraus, dass der auf diese Weise erstellte Store sich von dem in der App unterscheidet: Nach dem Ausführen enthalten sie unterschiedliche Werte. Wir haben dies auf verschiedene Arten getestet und es scheint in der Tat ein Problem mit den Speichern (und nicht mit den Aktionen zum Beispiel) Wie sollten wir von einer HeadlessJS Aufgabe auf einen Redux-Speicher zugreifen?React Native: HeadlessJS und Redux - Zugriff auf Geschäft von Aufgabe

Relevante Code: store/configure.js:

configureStore = (client) => { 
    const middleware = createMiddleware(client); 
    const finalCreateStore = applyMiddleware(thunk, middleware, logger)(createStore); 
    const store = finalCreateStore(rootReducer, undefined, autoRehydrate()); 

    return store; 
}; 

Im Einsatz (sowohl in der App und im Dienst):

const client = new ApiClient(); 
const store = configureStore(client); 
client.setStore(store); 
persistStore(store, { 
    storage: AsyncStorage, 
} 

In der App wir einfach den Provider verwenden, um von reagieren-Redux Verwenden Sie das Geschäft, in dem Dienst, den wir store.dispatch verwenden.

+0

Für zukünftige Suchende: Da wir es nicht in einem vernünftigen Zeitrahmen arbeiten konnten, haben wir uns für eine nicht-store-basierte Lösung entschieden, um Informationen zwischen der App und der Headless-Aufgabe auszutauschen. Wir haben AsyncStorage verwendet, das zuverlässig zwischen App und Task funktioniert. – Joran

+1

Ich stolperte über das gleiche Problem mit einer Audio-Player-App. Ereignisse vom Audio-Player sollten weiterhin Änderungen an den Redux-Speicher senden, auch wenn sie im Hintergrund sind. – fraherm

Antwort

0

erstellen Sie einfach den Speicher innerhalb der Aufgabe, so dass es durch redox-persist rehydratisiert werden würde.

Dies ist tatsächlich passiert.

Sie haben zwei Geschäfte erstellt (nicht ratsam mit Redux), die beide hydrat waren, aber nicht verbunden, da es keine verknüpften Redux-Speicher gibt. Jedes Mal, wenn Sie createStore ausführen, handelt es sich um einen neuen Store. Und jedes Mal, wenn Sie versenden, tun Sie das in einem bestimmten Geschäft.

Leider werden Async- oder Multithread-Probleme von Redux nicht direkt angesprochen.

Es wäre jedoch möglich, mit Middleware und/oder Speicher-Listener die beiden Speicher synchron zu halten.

Aber Redux ist auch nicht nur ein Mittel für die Kommunikation zwischen Threads (was ich annehmen, diese Aufgaben sind, oder Sie könnten nur die Aufgabe einen Verweis auf den Laden geben, sobald es erstellt wurde oder geben Sie die Haupt-App die Geschäftsreferenz von der Aufgabe).

Es ist mehr eine Form von Command-Query-Separation und zentralisierten Zustand.

Verwandte Themen