如何从不知道 Redux 的服务调度操作
How to dispatch an action from a service unaware of Redux?
假设我有一个不知道 Redux 的地理位置服务,我像这样配置它:
backgroundGeoLocation.configure(
callback // will be called with an argument when the coordinates change
);
使服务回调调度 Redux 操作而不从单独的模块导出store
并使用store.dispatch()
的最干净方法是什么(因为这将是单例(?
如果你想在
JavaScript中将一些值传递给某些代码,你需要使用函数。
例如
function createGeoLocationService(store) {
let backgroundGeoLocation = new BackgroundGeoLocation()
backgroundGeoLocation.configure(coordinates => {
store.dispatch({ type: 'UPDATE_COORDINATES', coordinates })
})
return backgroundGeoLocation
}
现在,无论您在哪里创建商店,请创建该服务:
let store = createStore(reducer)
let backgroundGeoLocation = createGeoLocationService(store)
如果需要在组件中访问它,可以:
- 使其成为单例(是的,不是您想要的,但它是仅限客户端的应用程序的有效选项(
- 通过道具明确传递它(可能会很乏味,但这是最直接和明确的方式(
- 通过上下文隐式传递它(非常简单,但您将处理一个不稳定的 API,该 API 可能会发生变化,因此这是您的良心(
如果您不想callbackFn
了解store.dispatch
那么您必须创建类似 事件流 或 从callbackFn
观察 .完成后,您只需将流映射到store.dispatch
函数即可。
您可以自由使用任何库来创建流,但我推荐 Rx
在这种方法中,您必须提供如下内容:
var geoLocation$ = new Rx.Subject();
var newCoordinatesAction = coordinates => ({
type: "YOUR_TUPE",
payload: coordinates
});
geoLocation$.map(newCoordinatesAction).map(store.dispatch);
backgroundGeoLocation.configure(::geoLocation$.onNext);
相关文章:
- 如何使用WCF服务和javascript表单post上传.doc文件
- 监视函数从服务返回不起作用,但作用域函数起作用
- 通过Magento的网络服务检索运费
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 使用angular.js问题的JavaSpringREST服务
- AngularJS-需要在index.html页面中访问来自服务的数据
- 如何在Ionic2测试版中包含Ionic.io服务
- 调度没有'无法立即更新组件
- 基于api密钥的NodeJS web服务
- 在dhtmlx调度程序中多次触发OnEventSave
- Redux应用程序结构-在哪里放置服务/业务逻辑
- Liferay:从portlet调用JSON服务
- 使用javascript在客户端上使用Web服务
- 如何通过安全的https连接在javascript中使用基于soap xml的Web服务
- 从Javascript连接到SOAP Web服务
- 如何检测服务广告维度
- 很少有角服务,只有常数不同
- 如何在服务、技能、投资组合等方面添加滑动效果
- 尝试将服务链接到控制器时出现角度问题
- 如何从不知道 Redux 的服务调度操作