2011-08-18 97 views
0

我剛剛開始使用node.js和zeromq綁定,看到一些我不太明白的行爲。node.js被多次調用的回調

這裏是我的示例代碼,同一臺機器上調用另一個基於Ruby的zeromq REP過程在端口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"); 

我用我的瀏覽器擊中節點服務器,並等待響應。奇怪的是,輸出我在控制檯得到跨越進來的添加劑的方式,我不是在所著的Grokking:

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請求塊外,其刪除附加行爲,但它也不包含我需要的請求/響應對象。

這個練習的要點是讓瀏覽器等待響應從端口9000上長時間運行的zeromq服務器進程返回(目前只是假裝睡眠響應)。

我敢肯定,我只是誤解了這裏的回調,但無法找到很多在這種情況下的文檔。

感謝您的任何幫助。

+0

吉姆的回答只是指出了什麼我已經假定,在我原來的問題指出(感謝您抽出時間來回答,雖然)。 任何人都可以幫助如何將事件綁定代碼移出請求處理程序,並仍然允許zmqSocket的on('message')事件訪問http響應對象? – earthtrip

回答

4

您正在重新綁定您的zmqSocket.on(「信息」,功能(數據){事件每次傳入請求到來,這導致多個事件結合,移動代碼塊您的請求處理程序之外。

0

嘗試:

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); 
    }); 

}); 

這樣的功能將只能綁定,每次一個消息

+0

感謝亞歷克斯,但由於某些原因,當我用多個併發請求打到服務器時無法正常工作。這些事件不會綁定到調用者,而是從調用者未做出的請求中獲取響應。不確定發生了什麼。 無論如何 - 仍然在這裏尋找解決方案。 – earthtrip