暂停非流动的流(延迟可读事件)

时间:2014-02-03 16:16:01

标签: node.js stream long-polling

一方面我有一个http请求(长轮询)。另一端是“游戏服务器”调度事件。这些端部在对象模式下与双工非流动流绑在一起,该部分工作正常。

长轮询结束侦听readable并通过反复调用stream.read来消耗流。然后关闭客户端的连接。

游戏服务器使用stream.write将事件推送到客户端。

游戏中的一些事件实际上是几个事件,这就是问题所在: 当游戏服务器一次添加多个事件(重复调用stream.write)时,第一次写入触发readable,并且长轮询将填充事件并关闭。这非常不方便。

问题的关键在于我不能沉默readable然后在我完成写作时触发它。 所以我的问题是;我可以以某种方式“暂停”流并在之后恢复吗? 是否有另一种解决这个问题的方法?

我最好的选择是编写一系列事件,但我认为这是一个反模式。

以下是一些代码来说明我的问题:

var stream = require('stream');

var connection = stream.PassThrough({ objectMode: true });

var exhaust = function() {
    console.log('exhausting');
    var chunk;
    while ((chunk = connection.read()) !== null)
        console.log(chunk);

    console.log('exhausting end');
}

connection.on('readable', function(){
    console.log('Ready to read');
    exhaust();
});

for (var i = 0;i < 10;i++)
    connection.write({ test: true });

1 个答案:

答案 0 :(得分:0)

我最终向write写了一系列事件,但我很期待这个即将推出的功能,这可能是missin解决方案:

http://strongloop.com/strongblog/performance-node-js-v-0-12-whats-new/ http://nodejs.org/docs/v0.11.10/api/stream.html#stream_writable_cork