Node.js重复监听器问题

时间:2011-05-01 20:27:20

标签: event-handling node.js callback long-polling listeners

我是node.js的新手,并且很难掌握事件监听器/发射器动态。我正在尝试为典型的“新闻源”应用设置一个简单的长轮询监听器。我可以使用下面的代码注册并向听众发出事件。我的问题是每次发出一个事件时,都会被推送到客户端多次(两次或更多次)。

var http = require('http'),
events = require('events'),
url = require('url');

var event_emitter = new events.EventEmitter();

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

}).listen(3000,"127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

控制台日志显示每个ajax请求的两个“注册”请求,我不确定?get查询的来源:

  

//寄存器? = 1304280004069
  //寄存器?
= 1304280004068

客户端的ajax调用(位于html正文中):

$(document).ready(function() {
    function callNode() {
        $.ajax({
            url: '/node/register',
            cache: false,
            timeout: 100000 * 1000000,
            success: function(data) {
                function doSomethingWithData(newaction) {
                    $('#feed').prepend(newaction);
                }
                $.get('/news/'+ data+'/', doSomethingWithData);
                callNode();
            }
        });
    };
    callNode();
});

最后,另一个问题是ajax调用没有在后台发生,但页面似乎是“加载”,直到第一个节点发出(之后它在后台静默运行)。感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

我假设您正在使用jQuery来处理客户端请求。通过将缓存设置为 false ,jQuery会在每个请求中添加一个唯一的查询字符串,以确保您获得新数据。

您可能还想将doSomethingWithData方法移出AJAX调用,以使其更容易阅读。

$(document).ready(function() {
    function doSomethingWithData(newaction) {
        $('#feed').prepend(newaction);
    }

    (function callNode() {
        $.ajax({
            url: '/node/register',
            cache: false,
            timeout: 100000 * 1000000,
            success: function(data) {
                $.get('/news/'+ data+'/', doSomethingWithData);
                callNode();
            }
        });
    }());
});