обратный вызов node.js вызывается несколько раз - PullRequest
0 голосов
/ 19 августа 2011

Я только что начал играть с node.js и привязками zeromq сегодня и вижу поведение, которое я не совсем понимаю.

Вот мой пример кода, который вызывает другой процесс REP на основе ruby ​​на основе ruby ​​в порту9000 на той же машине:

var zeromq = require("zmq");
var http = require('http');

var counter = 0;

var availabilityResponse = function(counter, data, request, response) {
    var str = data.toString('utf-8');
    console.log(str);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.write(str);
    response.end();                 
}

var zmqSocket = zeromq.createSocket('request');
zmqSocket.connect("tcp://127.0.0.1:9000");


var server = http.createServer()
server.on('request', function(request, response) {
    counter += 1;
    zmqSocket.send("Hola! - This is call # " + counter);
    zmqSocket.on('message', function(data) {
        availabilityResponse(counter, data, request, response);
    });

});
server.listen(8888);
console.log("Starting HTTP server on port 8888");

Я бью сервер узлов, используя мой браузер, и жду ответа.Что странно, так это то, что вывод, который я получаю в консоли, происходит аддитивным способом, который я не обманывал:

Request received: Hola! - This is call # 1 - Now going to sleep for 1.0

Request received: Hola! - This is call # 2 - Now going to sleep for 3.0
Request received: Hola! - This is call # 2 - Now going to sleep for 3.0

Request received: Hola! - This is call # 3 - Now going to sleep for 3.0
Request received: Hola! - This is call # 3 - Now going to sleep for 3.0
Request received: Hola! - This is call # 3 - Now going to sleep for 3.0

Request received: Hola! - This is call # 4 - Now going to sleep for 2.0
Request received: Hola! - This is call # 4 - Now going to sleep for 2.0
Request received: Hola! - This is call # 4 - Now going to sleep for 2.0
Request received: Hola! - This is call # 4 - Now going to sleep for 2.0

Я попытался переместить вызов zmqSocket.on () за пределы запроса httpблок, который удаляет аддитивное поведение, но также не включает в себя объекты запроса / ответа, которые мне нужны.

Смысл этого упражнения заключается в том, чтобы браузер дождался ответа от долго выполняющегося процесса сервера zeromq на порту 9000 (в настоящее время это просто ложный ответ спящего режима).

Я почти уверен, что неправильно понимаю обратный вызов, но не могу найти много документации по этому сценарию.

Спасибо за любую помощь.

Ответы [ 2 ]

4 голосов
/ 19 августа 2011

Вы перепривязываете свой zmqSocket.on ('message', function (data) {событие каждый раз, когда поступает входящий запрос. Это вызывает множественные привязки событий, переместите этот блок кода за пределы вашего обработчика запросов.

0 голосов
/ 19 августа 2011

Попробуйте:

server.on('request', function(request, response) {
    counter += 1;
    zmqSocket.send("Hola! - This is call # " + counter);
    zmqSocket.once('message', function(data) {
        availabilityResponse(counter, data, request, response);
    });

});

Таким образом, функция будет привязана только к одному сообщению каждый раз.

...