为长轮询发出特定于用户的事件

时间:2011-02-07 01:24:05

标签: event-handling node.js

为用户特定事件实施长轮询的最佳方法是什么?我为每个用户提供了一个“主页”,我希望在新信息出现时立即动态更新。

现在我正在从客户端进行AJAX调用/ register?id = 2,例如,监听更新。当发生与用户(id = 2)相关的某个其他事件(eventid = 3)时,服务器本身向/ emit?id = 2& eventid = 3发送GET请求。 Node.js服务器的代码类似于以下代码:

var event_emitter = new events.EventEmitter();
http.createServer(function(req,res) {

var uriParse = url.parse(req.url,true);
var pathname = uriParse.pathname;
if (pathname=="/register") {
    var userid = uriParse.query.id;
    var thisRes = res;
    event_emitter.addListener('event'+userid,function(eventid){
        if (thisRes) {
            console.log(thisRes);
            thisRes.writeHead(200, { "Content-Type": "text/plain" });
            thisRes.end(eventid);
            thisRes = null;
        }
    });
} else if (pathname=="/emit") {
    var userid = uriParse.query.id;
    var eventid = uriParse.query.eventid;
    event_emitter.emit('event'+userid,eventid);
    res.writeHead(200, { "Content-Type": "text/plain" });
    res.end('success');
}

}).listen(3000,"0.0.0.0");

因此,在事件发生之前,客户端的AJAX调用不会加载,此时服务器会返回带有eventid的响应。客户端使用这个eventid进行不同的AJAX调用(不相关,因为我将Django用于主应用程序,而Node.js用于事件驱动的超级权限)。

随着更多用户连接,为“event2”“event454”等创建了如此多的监听器,我感到很困扰。这是可扩展的Node.js吗?我怎样才能发出特定于用户的事件?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以在使用removeAllListeners发出事件后删除侦听器。