2017-06-21 85 views
0

爲什麼這兩個水庫&插座「超時」處理程序被觸發 而我只能撥打爲什麼res&socket'timeout'處理程序被觸發,而我只調用socket.emit('timeout')?

socket.emit('timeout'); 

不知道這是否是明顯的東西給你。謝謝。

[輸出]

[Function] 
[Function] 
true 
timeout 
timeout2 

[代碼]

var http = require('http'); 

function http_relay(req, res){ 
    //console.log(res); 
    console.log(req.socket === res.socket); 
    //console.log(res. 
    console.log(res.socket._events.timeout) 
    console.log(res.connection._events.timeout) 
    console.log(res.socket._events.timeout === res.connection._events.timeout) 

    res.on('timeout',function(){ 
     //res.end(); 
     console.log('timeout'); 
    }); 

socket = res.socket; 
    socket.on('timeout',function(){ 
     //res.end(); 
     console.log('timeout2'); 
    }); 

socket.emit('timeout'); 
//res.emit('timeout'); 
} 


    ser = http.createServer(http_relay); 

    ser.listen(8080); 

回答

0

當有呼入HTTP連接時,http.ServerResponse類鉤起來使用該套接字超時事件的監聽器:

socket.on('timeout', ...) 

當它得到那個事件它然後這樣做:

res.emit('timeout', ...) 

的總體思路是,開發商通常不會直接與socket本身接口,而只是與response對象交互。

因此,當您手動觸發套接字上的超時事件時,響應對象的事件偵聽器將看到該超時事件並觸發響應對象上的超時事件。

您可以在the nodejs Github repository中查看此處的代碼。

+0

非常感謝您的解釋和您的鏈接。現在流程對我來說很清楚。流:發送套接字超時事件 - >套接字超時回調 - >與此回調,發射res超時事件 - > res超時回調。 – user1384726

+0

@ user1384726 - 是的,就是這樣。使用開源庫進行編程的一個巨大優勢是您可以查看代碼(如果您可以通過搜索找到合適的代碼片段)並查看它到底在做什麼。 – jfriend00

+0

在我懷疑導致行爲的'套接字'類和'響應'類之間存在某種關係之前。我確實看到'socket'是'console.log'的'response'的屬性。但是,情況並非如此。再次感謝您的解釋。 – user1384726

相關問題