NodeJS的标准冲洗?

yquaqz18  于 2022-12-29  发布在  Node.js
关注(0)|答案(4)|浏览(135)

nodejs是否有像python或其他语言那样的stdout刷新?

sys.stdout.write('some data')

sys.stdout.flush()

现在我只看到nodejs的process.stdout.write()

5lwkijsr

5lwkijsr1#

process.stdout是一个WritableStream对象,WritableStream.write()方法自动刷新流(除非它被显式地堵塞)。但是,如果刷新成功,它将返回true,如果内核缓冲区已满,它还不能写入,它将返回false。如果你需要连续写入几次,你应该处理drain事件。
请参阅write的文档。

xam8gpfp

xam8gpfp2#

在较新的NodeJS版本中,您可以向.write()传递回调,该回调将在数据刷新后调用:

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

这与检查.write()结果并注册到drain事件完全相同:

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

gdx19jrr3#

如果数据已刷新,write将返回true。如果返回false,则可以等待“drain”事件。
我认为没有flush,因为那将是一个阻塞操作。

wgx48brx

wgx48brx4#

还有另一个函数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
stdout.write之前使用flush函数,因为它将清除屏幕,如果放在之后,将看不到任何输出

相关问题