将 flux (fluxxor) 实例从 actions hash 传递到代理对象

pass an instance of flux (fluxxor) from actions hash to a proxy object

在我的 Fluxxor 应用程序中,我正在代理 ajax 调用来解析结果。我希望能够从该模块内分派响应有效负载。有人告诉我,我可以通过传入 flux 实例来做到这一点,然后我可以像这样发送:

flux.dispatcher.dispatch({type: SomeActionType, payload: somePayload});

我的actions.js文件:

/** 
*actions.js
*/

var api = require('./api');
var constants = require('./constants');

actions = {
  someAction() {
    ///  I want to dispatch some messages from inside the api module
    api.get('hello');
    // instead of doing it here
    this.dispatch(SomeActionType, somePayload);

  }
}

module.exports = actions;

我不确定如何将 flux 实例传递给 api 模块,而不是将它传递给每个感觉不正确的请求的 "get" 方法调用。

如何将通量实例放入 api 模块?

更新:

我刚刚意识到我在 node_modules 中有通量库。我可以在我的 api 模块中只需要助焊剂吗?

var flux = require('flux')

那么我可以访问 Dispatcher.dispatch.. 或者这是否违反了 fluxxor 的精神?

一个常见的习惯用法是在第三方模块中发出请求,但在动作创建者中调度动作。这使您的网络 API(发出 Ajax 请求)和特定于商店的通知(由 flux 使用)清晰地分开,并且更易于测试。

actions = {
  someAction() {
    api.get('hello')
    .then((resp) => {
      // success case
      this.dispatch(SomeActionType, somePayload);
    }, (err) => {
      // failure case
      this.dispatch(SomeActionType, somePayload);
    });

  }
}

api = {
  get(param) {
    return whateverAjax(param);
  }
}

但是,如果您真的想从 API 触发操作,您可以按顺序创建和连接您的依赖项,然后传递它们。 (这也有助于测试,因为您可以在测试中传入模拟实例。)

// api.js

module.exports = (flux) => {
  return {
    get(param) {
      whateverAjax(param).then((resp) => flux.dispatcher.dispatch(...));
    }
  }
}

// actions.js

module.exports = (api) => {
  someAction() {
    api.get('hello');
  }
}

// whever you init your Fluxxor.Flux object...

var api = require("./api");
var actions = require("./actions");

var flux = new Fluxxor.Flux(stores); // no actions to start

api = api(flux);
actions = actions(api);

flux.addActions(actions);

补充说明:您在问题末尾提到的 flux 库是 Facebook's Flux library,与 Fluxxor 没有任何关系。