Node.js проблема дубликатов слушателей - PullRequest
1 голос
/ 02 мая 2011

Я новичок в 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/');

В журнале консоли отображаются два запроса 'register' для каждого 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 Ответ

2 голосов
/ 02 мая 2011

Я предполагаю, что вы используете 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();
            }
        });
    }());
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...