React Native:HeadslessJS和Redux - 如何从任务访问存储

时间:2017-03-03 17:16:37

标签: javascript reactjs redux

我们有一个使用redux,redux-persist和HeadlessJS任务的ReactNative应用程序。此任务需要访问商店。由于任务在没有启动整个应用程序的情况下触发(默认情况下没有访问权限),我们认为我们可以简单地在任务中创建商店,以便它可以通过redux-persist重新水合。然而,事实证明,以这种方式创建的商店与应用程序中的商店不同:运行后,它们包含不同的值。我们用几种方式对它进行了测试,这似乎确实是商店的问题(而不是例如行动) 我们应该如何从HeadlessJS任务访问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,
}

在应用程序中,我们只使用react-reactx中的Provider来使用商店,在我们使用store.dispatch的服务中。

2 个答案:

答案 0 :(得分:0)

  

只需在任务中创建商店,以便它可以通过redux-persist重新水合。

这确实发生了。

您创建了两个商店(不建议使用redux),它们都是水合物,但没有链接,因为没有链接的redux商店这样的东西。 每次运行createStore时,它都是一个新商店。每次发货时,都会在特定的商店进行。

不幸的是,redux没有直接解决异步或多线程问题。

虽然中间件和/或商店监听器可以使两个商店保持同步。

但是redux也不是线程之间通信的一种手段(我假设这些任务是,或者你可以在创建任务后给任务一个引用,或者给主应用程序提供任务的商店引用) )。

它更像是一种命令 - 查询 - 分离和集中状态。

答案 1 :(得分:0)

适合寻求解决方案的人。我在这里找到了解决方案。 这个想法是将商店绑定到异步方法。

https://github.com/react-native-kit/react-native-track-player/issues/63

在此处复制粘贴解决方案。

// index
const store = ...
....registerHeadlessTask('TrackPlayer', () => require('event-handler.js').bind(null, store));
// event-handler.js
module.exports = async (store, data) {
    if(data.type == '...') {
        store.dispatch(...);
    }
};