2015-07-30 12 views
5

Co jest zaletą tego sposobu odczytywania danych off czytelnej strumienia takie jak żądanie:NodeJS - Po co męczyć się z pętli while podczas odczytu danych off czytelnego strumienia wewnątrz .Na („czytelnej”) imprezy

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

vs w ten sposób bez pętli while inside? Skoro "czytelny" po prostu przestanie strzelać, po co zawracać sobie głowę pętlą while?

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

Ponieważ używa zdarzeń do informowania o gotowości danych. Używanie pętli while blokuje wszystkie operacje wejścia/wyjścia dla całego procesu, dopóki to jedno żądanie nie zostanie zakończone. request.on ("dane") to pokonuje. – eshortie

+0

Dlaczego więc nie mogę po prostu zignorować pętli while? – HelpMeStackOverflowMyOnlyHope

+0

Ponieważ, jak powiedziałem, blokuje ona wszystkie inne żądania od momentu wyświetlenia, dopóki nie zostanie zakończona, co oznacza, że ​​twoja usługa będzie wolna. Nie sądzę też, że napisany kod jest ważny, prawda? – eshortie

Odpowiedz

2

Zgodnie z dokumentacją API:

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

Korzystanie ('Dane') Event res.on uzyskać dane, gdy jest gotowy. Umożliwi to twojemu programowi poruszanie się i robienie innych rzeczy, dopóki następny fragment danych nie będzie gotowy do przetworzenia (pamiętaj, że HTTP jest nad TCP, który pochodzi z porcji).

Korzystanie z poniższego kodu może zadziałać, ale dlaczego tak się dzieje, gdy zbędne jest spożywanie cykli procesora i blokowanie wykonywania innych kodów (pamiętaj, że kod JavaScript Node.js ma jedno wątek). Używanie zdarzeń jest o wiele lepsze, ponieważ pozwala twojemu JavaScriptowi pracować i przetwarzać dane wejściowe/wyjściowe bez niepotrzebnego blokowania procesu.

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