2015-07-30 1 views
5

Was der Vorteil dieser Art des Lesens von Daten aus einem lesbaren Strom wie eine Anforderung ist:NodeJS - Warum mit while-Schleife stören, wenn Daten aus lesbaren Stream innerhalb des .on Lese (‚lesbar‘) Ereignis

request.on('readable', function(){ 
    var chunk = null; 
    while (null !== (chunk = request.read())) { 
     response.write(chunk); 
    }; 
}); 

vs auf diese Weise ohne eine while-Schleife im Inneren? Da "lesbar" einfach weiterschiessen wird, warum sollte man sich mit der while-Schleife beschäftigen?

request.on('readable', function(){ 
    var chunk = request.read(); 
    if(chunk !== null){ 
     response.write(chunk);   
    } 
}); 
+0

Da es Ereignisse verwendet, um Ihnen zu sagen, wenn Daten bereit sind. Durch die Verwendung einer while-Schleife werden alle E/A-Vorgänge für den gesamten Prozess blockiert, bis diese eine Anforderung abgeschlossen ist. request.on ('data') überwindet das. – eshortie

+0

Warum ignoriere ich nicht einfach die while-Schleife? – HelpMeStackOverflowMyOnlyHope

+0

Weil, wie ich schon sagte, es blockiert alle anderen Anfragen von bedient werden, bis es Bedeutung bedeutet, wird Ihr Dienst langsam sein. Ich glaube auch nicht, dass der angegebene Code überhaupt gültig ist, oder? – eshortie

Antwort

2

Gemäß der API-Dokumentation:

var req = http.request(options, function(res) { 
    console.log('STATUS: ' + res.statusCode); 
    console.log('HEADERS: ' + JSON.stringify(res.headers)); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
    console.log('BODY: ' + chunk); 
    }); 
}); 

die res.on Verwendung ('Daten') Fall, dass Sie die Daten erhalten, wenn es bereit ist. Dies ermöglicht es Ihrem Programm, sich fortzubewegen und andere Dinge zu tun, bis der nächste Teil der Daten bereit ist, verarbeitet zu werden (erinnern Sie sich, dass HTTP über TCP ist, das in Blöcken kommt).

Die Verwendung des untenstehenden Codes könnte funktionieren, aber warum sollten Sie CPU-Zyklen unnötig verschlingen und anderen Code blockieren (denken Sie daran, dass Ihr Node.js-JavaScript-Code single-threaded ist). Das Verwenden von Ereignissen ist viel besser, da es Ihrem JavaScript ermöglicht, Ein-/Ausgaben auszuführen und zu verarbeiten, ohne den Prozess unnötig zu blockieren.

request.on('readable', function(){ 
    var chunk = null; 
    while (null !== (chunk = request.read())) { 
     response.write(chunk); 
    }; 
}); 
Verwandte Themen