回流动作全局调试
Reflux actions global debugging
有没有办法全局 console.log()
Reflux 中所有触发的动作?理想情况下同时打印他们的参数。
正如 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 不会将操作名称传递给发出的事件,这里有另一个解决方案,它更老套,但它应该可以用于调试目的。
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});
有没有办法全局 console.log()
Reflux 中所有触发的动作?理想情况下同时打印他们的参数。
正如 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 不会将操作名称传递给发出的事件,这里有另一个解决方案,它更老套,但它应该可以用于调试目的。
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});