2017-06-21 83 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

相关问题