节点有一个类EventEmitter
,它是node.js和电子编程的一个非常常见的工具。不幸的是,它是一个PITA来调试。想象一下这样的代码将EventEmitter移到调试器中的侦听器
import EventEmitter from `events`;
const emitter = new EventEmitter();
emitter.on('foobar', handleFoobar);
emitter.emit('foobar', 'foo', 'bar');
function handleFoobar(..args) {
console.log(...args);
}
现在我想在调试器中单步执行代码。当然,在这个小例子中,我可以在handleFoobar
上放置一个断点,但是,在真实代码我只是希望能够遍历代码,当我到达someEmitter.emit
时,我希望能够沿着“步入听众”。
不幸的是没有这样的功能AFAIK存在。 The implementation of EventEmitter
is fairly complex因此加强看到听众需要步进约20-25次。你可以在所有的出口点设置断点,但是至少有6个断点,当你想把它们全部打开/关闭时,这也是很烦人的。
是否有任何其他创造性的解决方案来有效地实施类似“步入监听器”上someEmitter.emit
线的时候?
想到的一个解决方案是用简单的实现代替events.js
。如果没有域的支持以及使用ES6功能它可以像
EventEmitter.prototype.emit(type, ...args) {
const listeners = this._listeners[type].slice();
listeners.forEach(listener => {
listener(...args);
}
return listeners > 0;
}
我想我也可以打补丁到原型如果process.env.NODE_ENV === 'development'
是否有其他更通用的解决方案小得多实施?就像也许是一个调试器功能,我可以挑选代码直接进入,但在调试器中选择进入它的出口点?