Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从不知道Redux的服务中分派操作?_Javascript_Redux - Fatal编程技术网

Javascript 如何从不知道Redux的服务中分派操作?

Javascript 如何从不知道Redux的服务中分派操作?,javascript,redux,Javascript,Redux,假设我有一个不知道Redux的地理定位服务,我将其配置为: backgroundGeoLocation.configure( callback // will be called with an argument when the coordinates change ); 如果不从单独的模块导出store,并且不使用store.dispatch()(因为这将是一个单例),让服务回调分派Redux操作的最干净的方法是什么?如果要在JavaScript中向某段代码传递一些值,则需要使用函数。

假设我有一个不知道Redux的地理定位服务,我将其配置为:

backgroundGeoLocation.configure(
  callback // will be called with an argument when the coordinates change
);

如果不从单独的模块导出
store
,并且不使用
store.dispatch()
(因为这将是一个单例),让服务回调分派Redux操作的最干净的方法是什么?

如果要在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)
如果需要在组件中访问它,可以:

  • 让它成为一个单例(是的,不是你想要的,但它是一个仅客户端应用程序的有效选项)
  • 通过道具明确地传递(可能会变得单调乏味,但这是最直接和明确的方式)
  • 通过上下文隐式地传递它(非常简单,但你将处理一个问题,所以这取决于你的良心)

  • 如果您不想
    callbackFn
    知道
    store.dispatch
    ,则必须从
    callbackFn
    创建类似事件流或可观察的内容。完成后,只需将流映射到
    store.dispatch
    函数

    您可以自由使用任何库来创建流,但我建议

    在这种方法中,您必须提供以下内容:

    var geoLocation$ = new Rx.Subject();
    var newCoordinatesAction = coordinates => ({
        type: "YOUR_TUPE", 
        payload: coordinates 
    });
    geoLocation$.map(newCoordinatesAction).map(store.dispatch);
    backgroundGeoLocation.configure(::geoLocation$.onNext);
    

    请注意,
    react redux
    中的
    使用了“通过上下文隐式传递”技术,因此,如果您正在使用redux,您已经在不知不觉中“处理不稳定的API”。@AnsonKao当不稳定的API发生变化时,您不需要更改应用程序。我们对你隐瞒它的用途。