2012-07-22 21 views
52

Ich habe gesucht, wie es in anderen Sprachen zu tun, und ich habe festgestellt, dass ich das Sonderzeichen \ b verwenden muss, um das letzte Zeichen zu entfernen. (how-do-i-erase-printed-characters-in-a-console-applicationlinux)Wie lösche ich Zeichen in der Konsole

Dies funktioniert nicht für node.js in mehreren Aufrufen von console.log();

Wenn ich ein einzelnes Protokoll schreiben:

console.log ("abc\bd"); 

ich das Ergebnis: abd

Aber wenn ich schreibe:

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

ich das Ergebnis:

abc
d

Mein Ziel ist es, eine neue Nachricht vorhanden wie drucken:

Warten
Abwarten.
Warten ..
Waiting ...

und wieder:

Warten
Abwarten.
usw.

alle in der gleichen Zeile.

Antwort

97

Es gibt Funktionen für 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); 

aktualisieren 13. Dezember 2015: Obwohl die obige Code funktioniert, ist es nicht mehr dokumentiert als Teil process.stdin. Es ist umgezogen zu readline

+1

Ich erwarte, dass unter der Haube des ‚\ r‘ Charakter ermöglicht dies. Dieses Zeichen bringt den Cursor an den Anfang der Zeile zurück, ohne eine neue Zeile zu beginnen. –

+0

Nicht auf Windows obwohl. –

+6

@pimvdb Wo sind diese Funktionen dokumentiert? Sie scheinen nicht in der Node-Dokumentation: http://nodejs.org/api/process.html#process_process_stdout –

17

Jetzt sollten Sie require('readline') und sein API verwenden, um dieses Zeug zu tun.

+0

verdient keine lib 'require' – fedeghe

9

Der einfachste Weg, um die gleiche Linie zu überschreiben ist

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

die \r ist der Schlüssel. Es bewegt den Cursor zurück zum Anfang der Zeile.

+5

Das einzige Problem mit '\ r' ist, dass es die aktuelle Zeile nicht löscht. Also, wenn Sie "abcdefg \ r" das erste Mal schreiben und "zyxw \ r" das nächste Mal, werden Sie mit "zyxwefg" enden. – docksteaderluke

+0

Das stimmt, aber in diesem Fall sollten Sie immer eine längere Zeile schreiben als die vorherige. – jonnysamps

+4

Nicht im OP-Fall. – docksteaderluke

-3

Versuchen durch die \ r am Anfang des Strings bewegen, arbeitete diese unter Windows für mich:

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

Das funktioniert nicht - 'console.log' fügt am Ende der Zeichenfolge ein' \ n' hinzu. Sie müssen 'process.stdout.write' verwenden – Sethi

Verwandte Themen