回流动作全局调试

时间:2015-05-20 20:13:07

标签: javascript reactjs flux refluxjs

有没有办法在Reflux中全局console.log()所有被解雇的行动?理想情况下,同时打印他们的参数。

1 个答案:

答案 0 :(得分:7)

像Cory Danielson所说,Reflux使用EventEmitter。您可以像这样插入自己的EventEmitter实现:

Reflux.setEventEmitter(require('events').EventEmitter);

所以你想在那里注入一个启用了调试的EventEmitter构造函数,如下所示:

var EventEmitter = require('events').EventEmitter;

function DebugEventEmitter() {
  var realEmitter = new EventEmitter();

  var origEmit = realEmitter.emit;
  realEmitter.emit = function () {
    console.log('emitting', arguments);
    return origEmit.apply(realEmitter, arguments);
  };

  return realEmitter;
}

Reflux.setEventEmitter(DebugEventEmitter);

这只会劫持用于发出事件的emit方法,但您当然可以在EventEmitter上劫持任何其他方法并添加日志记录。

修改

由于Reflux没有将动作名称传递给发出的事件,这里的另一个解决方案是更加hackish,但它应该用于调试目的。

var Reflux = require('reflux');

// Do this before any code is calling Reflux
var origCreateAction = Reflux.createAction;
Reflux.createAction = function () {
  var action = origCreateAction.apply(Reflux, arguments);

  var wrapper = function () {
    console.log(action.actionName, 'called with args: ', arguments);
    return action.apply(action, arguments);
  };

  for (var key in action) {
    wrapper[key] = action[key];
  }

  return wrapper;
};

// Example using actions and triggering them, which logs
// with our wrapper
var Actions = Reflux.createActions([
  'statusUpdate',
  'statusEdited',
  'statusAdded'
]);

Actions.statusUpdate.listen(function () {
  console.log('status update called');
});

Actions.statusUpdate({test: 1});