Flux - 在任何地方都包含调度程序实例不是一个坏习惯吗?

时间:2015-04-27 12:17:14

标签: node.js reactjs flux

注意:我的问题是关于包含/传递调度程序实例的方式,而不是模式如何有用。

我正在研究Flux架构,我无法理解调度员(实例)的概念可能被包含在任何地方......

如果我想从模型层触发动作怎么办?在我的模型文件中包含一个对象的实例对我来说感觉很奇怪...我觉得这缺少了一些注入模式......

我的印象是确切的PHP等价物是(感觉)可怕的类似于:

<?php
$dispatcher = require '../dispatcher_instance.php';

class MyModel {
    ...
    public function someMethod() {
        ...
        $dispatcher->...


    }
}

我认为我的问题并不仅仅与Flux架构有关,而是与NodeJS的“做事方式”/做法有关。

1 个答案:

答案 0 :(得分:0)

TLDR:

  • 不,在您的商店中传递调度员的实例是不错的做法
  • 所有数据存储都应该有对调度程序的引用
  • 调用/使用代码(在React中,这通常是视图)应该只引用动作创建者而不是调度程序

您的代码与React不完全对齐,因为您正在数据存储上创建公共可变函数。

与Flux中的商店进行通信的 ONLY 方式是通过message passing,它始终通过调度程序。

例如:

var Dispatcher = require('MyAppDispatcher');
var ExampleActions = require('ExampleActions');

var _data = 10;
var ExampleStore = assign({}, EventEmitter.prototype, {

  getData() { 
    return _data;
  },

  emitChange() {
    this.emit('change');
  },

  dispatcherKey: Dispatcher.register(payload => {
    var {action} = payload;
    switch (action.type) {
      case ACTIONS.ADD_1: 
        _data += 1;
        ExampleStore.emitChange();
        ExampleActions.doThatOtherThing();
        break;
    }
  })

});

module.exports = ExampleStore;

通过关闭_data而不是直接在商店中拥有data属性,您可以强制执行消息传递规则。这是私人会员。

同样重要的是要注意,虽然你可以直接调用Dispatcher.emit(),但这不是一个好主意。

通过动作创建者有两个主要原因:

  1. 一致性 - 这是您的观看和其他消费代码与商店互动的方式
  2. 更容易重构 - 如果您从应用程序中删除ADD_1操作,此代码将抛出异常而不是通过发送与任何不匹配的消息无声地失败在任何商店中切换语句
  3. 此方法的主要优点

    • 松散耦合 - 添加和删除功能是轻而易举的。商店可以通过添加一行代码来响应系统中的任何事件。
    • 复杂性降低 - 数据流的一种方式使包裹数据流更加容易。减少相互依赖。
    • 更容易调试 - 您可以使用几行代码调试系统中的每个更改。

    调试示例:

    var MyAppDispatcher = require('MyAppDispatcher');
    MyAppDispatcher.register(payload => {
      console.debug(payload);
    });