2012-09-20 12 views
16

¿Hay alguna descarga stdout para nodejs como python u otros lenguajes?Stdout flush para NodeJS?

sys.stdout.write('some data') 

sys.stdout.flush() 

En este momento sólo vi process.stdout.write() para nodejs.

Respuesta

9

process.stdout es un objeto WritableStream, y el método WritableStream.write() automáticamente vacía la secuencia (a menos que esté explícitamente tapada). Sin embargo, volverá a ser verdadero si el borrado fue exitoso, y falso si el buffer del núcleo estaba lleno y no puede escribir todavía. Si necesita escribir varias veces seguidas, debe manejar el evento drain.

Ver the documentation for write.

1

write devuelve true si los datos se han purgado. Si devuelve false, puede esperar el evento 'drain'.

Creo que no hay flush, porque eso sería una operación de bloqueo.

+0

Corriente .write() ya es una operación de bloqueo. – jrajav

+0

@Kiyura Casi a la derecha. Stream.write no está bloqueando, pero para stdout usualmente es: http://nodejs.org/api/process.html#process_process_stdout Gracias, no lo sabía. – Ishtar

+0

Ya veo. Realmente no sabía de ninguna manera, para ser sincero, pero supuse que tendría que estar bloqueando al menos el punto que escribía en el búfer del kernel. Supongo que eso no es "bloqueo suficiente" para que cuente según Nodo. :) – jrajav

3

En las versiones más recientes nodejs, puede pasar una devolución de llamada a .write(), que se llamará una vez que los datos se vacía:

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

Ésta es exactamente la misma que la comprobación .write() resultado y el registro al evento drain:

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

Hay otra función stdout para borrar la última salida a la terminal que es una especie de obra como 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 el cursor se moverá a la posición 0 que es el punto de partida

utilizar la función flush antes stdout.write porque va a borrar la pantalla, si se pone después de que usted no verá ninguna salida