node.js 回调被多次调用

ear*_*rip 0 callback zeromq node.js

我今天刚刚开始使用 node.js 和 Zeromq 绑定,并看到一些我不太理解的行为。

这是我的示例代码,它调用同一台计算机上端口 9000 上的另一个基于 ruby​​ 的 Zeromq REP 进程:

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");
Run Code Online (Sandbox Code Playgroud)

我正在使用浏览器访问节点服务器并等待响应。奇怪的是,我在控制台中得到的输出是以加法方式出现的,我并没有想到:

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
Run Code Online (Sandbox Code Playgroud)

我尝试将 zmqSocket.on() 调用移到 http 请求块之外,这消除了附加行为,但它也不包含我需要的请求/响应对象。

这个练习的目的是让浏览器等待,直到响应从端口 9000 上长时间运行的 Zeromq 服务器进程返回(当前只是一个伪造的睡眠响应)。

我很确定我只是误解了这里的回调,但在这种情况下找不到太多文档。

谢谢你的帮助。

小智 5

每次传入请求进来时,您都会重新绑定 zmqSocket.on('message', function(data) { 事件。这会导致多个事件绑定,将该代码块移到请求处理程序之外。