2016-11-07 36 views
1

节点有一个类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个断点,当你想把它们全部打开/关闭时,这也是很烦人的。

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

我找到了解决方案。它被称为blackblocking

你可以通过脚本文件名来设置哪些文件不要进入,所以在列表中添加events.js就是我想要的。当我在someEmitter.emit上,然后按下“Step Into”我立即走出听众!

enter image description here

相关问题