2012-09-20 17 views
16

Czy jest jakikolwiek spudułek dla nodejów, takich jak python lub inne języki?Stdout flush dla NodeJS?

sys.stdout.write('some data') 

sys.stdout.flush() 

W tej chwili widziałem tylko process.stdout.write() dla nodejs.

Odpowiedz

9

process.stdout to obiekt WritableStream, a metoda WritableStream.write() automatycznie opróżnia strumień (chyba że został wyraźnie zakorkowany). Jednakże zwróci wartość true, jeśli flush zakończył się pomyślnie, i false, jeśli bufor jądra był pełny i nie może jeszcze pisać. Jeśli chcesz pisać kilka razy z rzędu, powinieneś obsłużyć zdarzenie drain.

Zobacz the documentation for write.

1

write zwraca true jeśli dane zostały opróżnione. Jeśli zwróci false, możesz poczekać na wydarzenie "drenaż".

Myślę, że nie ma flush, ponieważ byłaby to operacja blokująca.

+0

Stream .write() jest już operacją blokującą. – jrajav

+0

@Kiyura Prawie prawo. Stream.write nie blokuje, ale na standardowe wyjście zazwyczaj jest: http://nodejs.org/api/process.html#process_process_stdout Dzięki, nie wiedziałem o tym. – Ishtar

+0

Rozumiem. Tak naprawdę nie wiedziałem, tak czy inaczej, ale założyłem, że musiałoby to być zablokowane przynajmniej do tego, co napisał do bufora jądra. Domyślam się, że to nie jest "wystarczająco blokujące", aby liczyć zgodnie z Węzłem. :) – jrajav

3

W nowszych wersjach NodeJS, można przekazać wywołania zwrotnego do .write(), która zostanie wywołana, gdy dane jest zaczerwieniona:

sys.stdout.write('some data',() => { 
    console.log('The data has been flushed'); 
}); 

To jest dokładnie taka sama, jak sprawdzenie .write() wynik i rejestracji na wydarzenie drain:

var write = sys.stdout.write('some data'); 
if (!write) { 
    sys.stdout.once('drain',() => { 
    console.log('The data has been flushed'); 
    }); 
} 
-1

jest jeszcze inna funkcja stdout który wyczyścić ostatnie wyjście do terminala, który jest rodzaj pracy jak flush

function flush() { 
    process.stdout.clearLine(); 
    process.stdout.cursorTo(0); 
} 

var total = 5000; 
var current = 0; 
var percent = 0; 
var waitingTime = 500; 
setInterval(function() { 
    current += waitingTime; 
    percent = Math.floor((current/total) * 100); 
    flush(); 
    process.stdout.write(`downloading ... ${percent}%`); 
    if (current >= total) { 
     console.log("\nDone."); 
     clearInterval(this); 
    } 
}, waitingTime); 

cursorTo będzie przesunąć kursor do pozycji 0 który jest punktem wyjścia

użyć funkcji flush przed stdout.write ponieważ będzie to wyczyścić ekran, jeśli umieścić po nie ma wyniku