2017-06-21 1 views
0

Pourquoi gestionnaire deux res & socket « timeout » sont déclenchées alors que je ne convoquent quePourquoi le gestionnaire res & socket 'timeout' est-il déclenché alors que j'appelle seulement socket.emit ('timeout')?

socket.emit('timeout'); 

Je ne sais pas si cela est quelque chose d'évident pour vous. Je vous remercie.

[Sortie]

[Function] 
[Function] 
true 
timeout 
timeout2 

[Code]

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

Répondre

0

Quand il y a une connexion entrante http, les crochets de classe http.ServerResponse un écouteur pour l'événement de délai d'attente de prise en utilisant ceci:

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

et quand il obtient cet événement, il le fait alors:

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

L'idée générale est que le développeur ne serait normalement pas une interface directe avec le socket lui-même, mais plutôt d'interagir simplement avec l'objet response. Par conséquent, lorsque vous déclenchez manuellement l'événement timeout sur le socket, l'écouteur d'événement de l'objet de réponse voit cet événement timeout et déclenche l'événement timeout sur l'objet de réponse.

Vous pouvez voir le code pour cela ici dans the nodejs Github repository.

+0

Merci beaucoup pour votre explication et votre lien. Maintenant, le flux est assez clair pour moi. Flow: événement socket timeout émis -> socket timeout callback -> avec ce rappel, res timeout event émit -> res timeout callback. – user1384726

+0

@ user1384726 - Oui, c'est exactement ça. Un énorme avantage de la programmation avec une bibliothèque open source est que vous pouvez simplement regarder le code (si vous pouvez trouver le bon morceau de code avec search) et voir exactement ce qu'il fait. – jfriend00

+0

Avant de douter, il y a une relation entre la classe 'socket' et la classe 'response' qui provoquent le comportement. Je vois 'socket' est l'attribut de 'response' par 'console.log'. Cependant, ce n'est pas le cas. Encore merci pour votre explication. – user1384726