Node有一个类EventEmitter
,它是node.js和电子编程的常见工具。不幸的是,它是一个PITA来调试。想象一下像这样的代码
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
时,我只希望能够逐步执行代码。我希望能够选择“Step Into Listeners”的内容。
不幸的是,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'
还有其他更通用的解决方案吗?就像一个调试器功能,我可以选择代码从不直接进入,但在调试器中选择步骤是从它的退出点出来的?