我有一个对象
最终,似乎并不重要;所有数据都被写入了文件。但是我想尽可能遵循“规则”。
我知道我可以监听
下面是我的情况示例:
EventEmitter
,我已经设置成监听事件。当事件被触发时,我想要将信息写入文件。我通过fs.createWriteStream(path, { flags: 'a' })
打开了一个FileStream
。目前我的问题在于,如果我非常频繁地触发事件,我就会开始“积压”。也就是说,.write
返回false
,要求我暂停写入一段时间。由于我是在事件处理程序中进行写入的,所以附近没有回调函数可用来指示写入过程的结束。从处理或触发方面,我该如何防止积压呢?最终,似乎并不重要;所有数据都被写入了文件。但是我想尽可能遵循“规则”。
我知道我可以监听
drain
事件,在此之后重新开始写入,但是我如何防止其他事件进入处理程序?我注意到,如果我在每次触发之前都有50ms的延迟,积压似乎就不会发生,但这似乎有点像黑客行为。而且,如果您的硬盘速度较慢怎么办?下面是我的情况示例:
var ee = new EventEmitter();
var stream = fs.createWriteStream('./file/log.txt', { flags:'a'} );
ee.on('report', function (i) {
stream.write('new file data ' + i + ' --- ' + Date.now + '\n');
});
for (var i = 0; i < 10000; ++i) {
ee.emit('report', i)
}
以下并非完整代码,但是这是它的主要内容。完整的代码会在运行HTTP服务器时发送响应,但是如果我通过for循环等方式排队了1000个请求,就会出现上述情况。