Cách xóa các ký tự được in trong bảng điều khiển


77

Tôi đã tìm kiếm cách thực hiện nó bằng các ngôn ngữ khác và tôi nhận thấy rằng tôi phải sử dụng ký tự đặc biệt \ b để xóa ký tự cuối cùng. ( how-do-i-delete-print-character-in-a-console-applicationlinux )

Điều này không hoạt động cho node.js trong nhiều cuộc gọi tới console.log ();

Nếu tôi viết một nhật ký:

console.log ("abc\bd");

Tôi nhận được kết quả: Abd

Nhưng nếu tôi viết:

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

Tôi nhận được kết quả:

abc
d

Mục tiêu của tôi là in một tin nhắn đang chờ như:

Đang chờ
đợi.
Đang đợi ..
Đang đợi ...

Và một lần nữa:

Đang chờ
đợi.
Vân vân

tất cả trong cùng một dòng.

Câu trả lời:


131

Có các chức năng có sẵn cho 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);

Có thể cung cấp các đối số để clearLine(direction, callback)

/**
 * -1 - to the left from cursor
 *  0 - the entire line // default
 *  1 - to the right from cursor
 */

Cập nhật ngày 13 tháng 12 năm 2015: mặc dù mã trên hoạt động nhưng nó không còn được ghi lại như một phần của process.stdin. Nó đã chuyển đếnreadline


1
Tôi hy vọng rằng ký tự '\ r' sẽ kích hoạt tính năng này. Ký tự này trả con trỏ về đầu dòng mà không bắt đầu dòng mới.
Casey Watson,

Không có trên cửa sổ mặc dù.
Adam K Dean,

7
@pimvdb Các hàm này được ghi ở đâu? Chúng dường như không có trong tài liệu Node: nodejs.org/api/process.html#process_process_stdout
Henry Merriam

5
Điều này dường như không hoạt động trên OSX, không ai biết nếu nó nên?
Znarkus

1
Có thể API đã thay đổi. Câu trả lời này đã được viết cách đây hai năm, và bất kỳ nhà phát triển JS nào ít nhất cũng phải có một số ý tưởng về mức độ đã thay đổi trong hai năm qua. Chúng tôi đã chuyển từ một số ngôn ngữ biên dịch sang JS (đáng chú ý nhất là CoffeeScript) để chuyển đổi phiên bản mới nhất sắp ra mắt (sắp xuất bản), ES6. Hai năm trước, nếu tôi nhớ chính xác, các mô-đun ES6 thậm chí còn không tồn tại.
Isiah Meadows

19

Bây giờ bạn có thể sử dụng readlinethư viện và API của nó để thực hiện công việc này.


1
không xứng đáng với một librequire
liên bangghe

17

Cách dễ nhất để ghi đè lên cùng một dòng là

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

chính \rlà chìa khóa. Nó sẽ di chuyển con trỏ trở lại đầu dòng.


8
Vấn đề duy nhất với '\ r' là nó không xóa dòng hiện tại. Vì vậy, nếu bạn viết "abcdefg \ r" lần đầu tiên và "zyxw \ r" vào lần tiếp theo, bạn sẽ kết thúc bằng "zyxwefg".
docksteaderluke

Đúng vậy, nhưng trong trường hợp này, bạn nên viết một dòng dài hơn dòng trước đó.
jonnysamps

8
Không phải trong trường hợp của OP.
docksteaderluke

2

Điều này phù hợp với tôi:

process.stdout.write('\033c');
process.stdout.write('Your text here');

0

Sử dụng dịch vụ vận chuyển trở lại

Ký tự xuống dòng đặt con trỏ trở lại đầu dòng hiện tại.

process.stdout.write("\r");

Giải pháp này đã làm việc cho tôi - tôi chỉ thử nghiệm nó với một ký tự duy nhất.


Vận chuyển trở lại không chính xác ở đây vì nó xóa toàn bộ dòng. Nếu bạn thay thế nó bằng \btrong câu trả lời của bạn, nó sẽ hoạt động. Ngoài ra, hãy đảm bảo cập nhật ví dụ của bạn để ai đó đọc nó có thể hiểu ngay ví dụ của bạn (ở đây tôi tự hỏi: tại sao không cố gắng xóa một ký tự để chứng minh nó hoạt động bình thường?)
aymericbeaumet

-3

Hãy thử bằng cách di chuyển \ r ở đầu chuỗi, điều này hoạt động trên Windows đối với tôi:

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

1
Điều này sẽ không hoạt động - console.logthêm một \nvào cuối chuỗi của bạn. Bạn cần sử dụngprocess.stdout.write
Sethi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.