Stdout flush для NodeJS?

Есть ли какой-нибудь stdout-flush для nodejs, как python или другие языки?

sys.stdout.write('some data')

sys.stdout.flush()

Прямо сейчас я видел только process.stdout.write() для nodejs.

Ответ 1

process.stdout - это объект WritableStream, а метод WritableStream.write() автоматически очищает поток (если только он не был явно укутан). Тем не менее, он вернет true, если флеш был успешным, и false, если буфер ядра был заполнен и он еще не может писать. Если вам нужно писать несколько раз подряд, вы должны обработать событие drain.

Смотрите документацию для write.

Ответ 2

В новых версиях NodeJS вы можете передать обратный вызов на .write(), который вызывается после сброса данных:

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

Это точно так же, как проверка результата .write() и регистрация на событие drain:

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

Ответ 3

write возвращает true, если данные были сброшены. Если он возвращает false, вы можете дождаться события "стока".

Я думаю, что нет flush, потому что это будет операция блокировки.

Ответ 4

Существует еще одна функция stdout, которая очищает последний вывод терминала, который является вроде работы типа 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 переместит курсор в позицию 0, которая является начальной точкой

используйте функцию flush до stdout.write, потому что она очистит экран, если вы поместите его после того, как вы не увидите какой-либо вывод