2017-03-03 30 views
11

我们有一个ReactNative应用程序,它使用了redux,redux-persist和HeadlessJS任务。该任务需要访问商店。由于任务在没有引导整个应用程序的情况下触发(因此默认情况下无法访问),我们认为我们可以简单地在任务内部创建存储,以便通过减少持久性来恢复它。然而,事实证明,以这种方式创建的商店与应用程序中的商店不同:在运行之后,它们包含不同的值。我们通过几种方式测试了这一点,看起来的确是商店的问题(而不是动作) 我们应该如何从HeadlessJS任务访问Redux商店?React Native:HeadslessJS和Redux - 如何从任务访问商店

相关的代码: store/configure.js

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

    return store; 
}; 

在使用中(无论是在应用程序和服务):

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

在应用中,我们简单地使用从反应-终极版的提供者在我们使用store.dispatch的服务中使用商店。

+0

对于未来的搜索者:由于我们无法在合理的时间范围内工作,我们选择了基于非商店的解决方案来交换应用程序和无头任务之间的信息。我们使用AsyncStorage,它可以在应用程序和任务之间可靠地工作。 – Joran

+1

我偶然发现了音频播放器应用程序的相同问题。来自音频播放器的事件仍然应该将更改发送到Redux商店,即使它位于后台。 – fraherm

回答

0

只需在任务内部创建商店,以便它可以通过还原持久来进行再水合。

这确实发生了。

您创建了两个商店(不建议使用redux),这两个商店都是水合的,但没有链接,因为没有链接的redux商店。 每次运行createStore时,它都是一个新的商店。每次你派遣,你都会在特定的商店上做到这一点。

遗憾的是,异步或多线程问题并未由redux直接解决。

尽管中间件和/或存储监听器使两个存储保持同步,但这是可能的。

但是,redux也仅仅是线程之间通信的一种意思(我假设这些任务是,或者您可以在任务创建之后给任务一个引用,或者给主应用程序提供来自任务)。

它更多的是Command-Query-Separation和集中状态的一种形式。

相关问题