在调试器中将EventEmitter转发给侦听器

时间:2016-11-07 15:46:30

标签: javascript node.js debugging electron

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个断点也很烦人。

enter image description here

还有其他有创意的解决方案可以在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'

,我也可以将其修补到原型中

还有其他更通用的解决方案吗?就像一个调试器功能,我可以选择代码从不直接进入,但在调试器中选择步骤是从它的退出点出来的?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。它叫做 blackblocking

您可以通过脚本文件名设置哪些文件不会进入,因此将events.js添加到列表中可以完全满足我的需要。当我在someEmitter.emit并且按下“Step Into”时,我立即出来听众!

enter image description here