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

Javascript React Native:HeadslessJS和Redux-如何从任务访问存储,javascript,reactjs,redux,Javascript,Reactjs,Redux,我们有一个使用redux、redux persist和HeadlessJS任务的ReactNative应用程序。此任务需要具有对存储的访问权限。由于任务在不启动整个应用程序的情况下启动(因此默认情况下没有访问权限),我们认为我们也可以在任务内部创建存储,这样它就可以通过redux persist重新水化。然而,事实证明,以这种方式创建的商店与应用程序中的商店不同:运行后,它们包含不同的值。我们以多种方式对此进行了测试,这似乎确实是商店的一个问题(而不是动作) 我们应该如何从HeadlessJS任

我们有一个使用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;
};
正在使用中(应用程序和服务中):

在应用程序中,我们只需使用react redux中的提供者来使用store,在服务中,我们使用store.dispatch

只需在任务内部创建存储,这样它就可以被redux persist重新水化

这确实发生了

您创建了两个存储(不建议使用redux),它们都是链接的,但没有链接,因为没有链接的redux存储。 每次运行createStore时,它都是一个新的存储。每次你发货的时候,你都会在特定的商店里发货

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

不过,使用中间件和/或存储侦听器可以使两个存储保持同步

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


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

供寻求解决方案的人使用。我在这里找到了解决办法。 其思想是将存储绑定到异步方法

在此处复制粘贴解决方案

// 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(...);
    }
};

对于未来的搜索者:由于我们无法让它在合理的时间范围内工作,我们选择了一种非基于商店的解决方案,在应用程序和无头任务之间交换信息。我们使用了AsyncStorage,它在应用程序和任务之间可靠地工作。我在音频播放器应用程序中偶然发现了同样的问题。来自音频播放器的事件仍应将更改发送到Redux存储,即使它位于后台。感谢您的澄清,这确实是发生的事情。我猜redux的原理是保持单一状态,Android的原理是让任务尽可能少地与应用程序相关。正如我在回复中所发布的,我们在没有商店的情况下解决了它,将商店作为参考传递也不起作用,因为这仍然可能导致时间问题。(对于其他读者,请注意,这一期已经将近一年了,我们从那时起就没有进一步研究过,所以我的答案可能不是最新的)没有注意到年龄,谢谢澄清。
// 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(...);
    }
};