【问题标题】:Node.js duplicate listeners issueNode.js 重复监听器问题
【发布时间】:2011-08-16 14:36:45
【问题描述】:

我是 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 调用没有在后台发生,但页面似乎正在“加载”,直到第一个节点发射(之后它在后台静默运行)。感谢您的任何建议。

【问题讨论】:

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


    【解决方案1】:

    我假设您使用 jQuery 来处理客户端请求。看起来通过将 cache 设置为 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();
                }
            });
        }());
    });
    

    【讨论】:

    • 嗯,这就解决了查询字符串的奥秘。但是,将缓存更改为 true 会导致没有监听器被注册(而不是 2+)..
    • 如何使用 Math.random() 或使用 POST 请求将自定义随机查询字符串添加到您的 /Register 调用中?前任。 url = "/注册?" + Math.floor(Math.random() * 1e16);
    • 好的,原来我只需要附加“?”使请求开始监听(不需要随机整数)。现在它的工作没有重复! :) 但是,页面显示不断“加载”.. 这个 Ajax 请求不应该在后台吗??
    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2020-05-23
    相关资源
    最近更新 更多