2017-06-08 5 views
0

Im Lernknoten und durch ein paar Beispiele arbeiten, habe ich einen Prototyp, der perfekt im Test funktioniert, aber ich bin besorgt, dass es "aus Versehen" funktioniert.Lebensdauer der HTTP-Anfrage

Der Code, (stark abgespeckte) läuft auf die folgende

function CheckValue(){ 
    var req=http.request({/*some options*/}, 
         function (resp){ 
         resp.on('data', 
           function (s){ 
         /* process the response */ 
         })}); 
    /* Tweak a few headers here. */ 
    req.end(); 
} 

jetzt nach unten, wenn ich die Dokumente richtig verstehen - die Anfrage tatsächlich auf dem Server an dem Punkt der req.end() und der Rückruf ist nicht gesendet verarbeitet, bis Daten empfangen werden.

Also; Wenn signifikant ist Verzögerung zwischen der Anfrage ausgegeben wird und die Antwort erhalten könnte das req Objekt Müll gesammelt werden? Wenn ja, würde der Callback vermutlich nicht angerufen werden? Oder betrachten Sie es aus einem anderen Blickwinkel: verwaltet Knoten intern alle Verweise auf HTTP-Anforderungen, bis sie vollständig sind?

(Der Code wird in einem Feuer absichtlich geschrieben und Weise vergessen, mit req intern innerhalb der Funktion und nicht gespeichert in jedem globalen Bereich scoped wird. Es wäre denkbar, die Anfrage in einem Array zu speichern und löscht die Anfrage während resp.on('end',...), aber ich würde lieber die Komplikation und Overhead vermeiden.)

+0

können Sie einfach http://www.delay.me/ verwenden, um Ihren Gedanken zu überprüfen – viz

Antwort

1

Ja. Siehe die documentation:

Klasse: http.Agent - Ein Agent für das Management des Verbindens Persistenz verantwortlich ist und Wiederverwendung für HTTP-Clients. Es verwaltet eine Warteschlange mit ausstehenden Anforderungen für einen bestimmten Host und Port, wobei für jede eine einzelne Socket-Verbindung wiederverwendet wird, bis die Warteschlange leer ist. Zu diesem Zeitpunkt wird der Socket entweder zerstört oder in einen Pool gestellt, in dem er für Anfragen weiterhin verwendet wird zu demselben Host und Port. Ob es zerstört oder gepoolt wird, hängt von der Option keepAlive ab.

Es gibt eine global Agent instance, die als Standard für alle HTTP-Client-Anfragen verwendet wird. Im Endeffekt wird diese Agenteninstanz die Referenz der Anforderungsobjekte behandeln und speichern, und daher wird das req-Objekt nicht als Garbage Collected erfasst.

+0

Ausgezeichnet. Vielen Dank. – Richard