2012-07-22 21 views
52

He estado buscando cómo hacerlo en otros idiomas y he descubierto que tengo que usar el carácter especial \ b para eliminar el último carácter. (how-do-i-erase-printed-characters-in-a-console-applicationlinux)Cómo borrar los caracteres impresos en la consola

Esto no funciona para node.js en llamadas múltiples a console.log();

Si escribo un solo registro:

console.log ("abc\bd"); 

puedo obtener el resultado: abd

Pero si escribo:

console.log ("abc"); 
console.log ("\bd"); 

puedo obtener el resultado:

abc
d

Mi objetivo es imprimir un mensaje de espera como:

espera
espera.
espera ..
espera ...

y otra vez:

espera
espera.
etc

todos en la misma línea.

Respuesta

97

Hay algunas funciones disponibles para process.stdout:

var i = 0; // dots counter 
setInterval(function() { 
    process.stdout.clearLine(); // clear current text 
    process.stdout.cursorTo(0); // move cursor to beginning of line 
    i = (i + 1) % 4; 
    var dots = new Array(i + 1).join("."); 
    process.stdout.write("Waiting" + dots); // write text 
}, 300); 

actualización 13 Dic, 2015: si bien funciona el código anterior, ya no se documentó como parte de process.stdin. Se ha movido a readline

+1

espero que bajo el capó el carácter '\ r' está permitiendo esto. Este caracter devuelve el cursor al comienzo de la línea sin iniciar una nueva línea. –

+0

No en Windows sin embargo. –

+6

@pimvdb ¿Dónde están documentadas estas funciones? No parecen estar en los documentos del nodo: http://nodejs.org/api/process.html#process_process_stdout –

17

Ahora debe usar require('readline') y su API para hacer esto.

+0

no merece una 'solicitud de lib ' – fedeghe

9

La forma más fácil para sobrescribir la misma línea es

var dots = ... 
process.stdout.write('Progress: '+dots+'\r'); 

la \r es la clave. Volverá a mover el cursor al comienzo de la línea.

+5

El único problema con' \ r 'es que no borra la línea actual. Entonces, si escribe "abcdefg \ r" la primera vez y "zyxw \ r" la próxima vez terminará con "zyxwefg". – docksteaderluke

+0

Eso es cierto, pero en este caso siempre debe escribir una línea más larga que la anterior. – jonnysamps

+4

No en el caso del OP. – docksteaderluke

-3

Trate moviendo el \ r al comienzo de la cadena, que funcionaba en Windows para mí:

for (var i = 0; i < 10000; i+=1) { 
    setTimeout(function() { 
     console.log(`\r ${i}`); 
    }, i); 
} 
+0

Esto no funcionará - 'console.log' agrega' \ n' al final de su cadena. Necesitas usar 'process.stdout.write' – Sethi

Cuestiones relacionadas