有没有一种方法可以在没有换行符的情况下打印到控制台?控制台对象文档没有说明这方面的任何内容:

console.log()打印到带有换行符的标准输出。此函数可以以类似printf()的方式接受多个参数。例子:console.log('计数:%d',计数);如果在第一个字符串中找不到格式化元素,则在每个参数上使用util.inspect。


当前回答

这些解决方案都不适用于我,process.stdout.write('ok\033[0G'),只需使用'\r'即可创建新行,但不会在Mac OSX 10.9.2上覆盖。

编辑:我不得不用它来替换当前行:

process.stdout.write('\033[0G');
process.stdout.write('newstuff');

其他回答

在Windows控制台(也是Linux)中,您应该将“\r”替换为其等效代码\033[0G:

process.stdout.write('ok\033[0G');

这使用VT220终端转义序列将光标发送到第一列。

似乎有很多答案表明:

process.stdout.write

错误日志应在以下时间发出:

process.stderr

而是使用:

console.error

对于任何想知道为什么process.stdout.write('\033[0G');没有做任何事情的人来说,这是因为stdout是缓冲的,您需要等待drain事件(更多信息)。

如果write返回false,它将触发一个drain事件。

此外,如果要覆盖同一行中的消息,例如倒计时,可以在字符串末尾添加\r。

process.stdout.write("Downloading " + data.length + " bytes\r");

作为上面@rodowi关于能够覆盖一行的精彩补充的扩展/增强:

process.stdout.write("Downloading " + data.length + " bytes\r");

如果您不希望终端光标位于第一个字符,如我在代码中看到的,请考虑执行以下操作:

let dots = ''
process.stdout.write(`Loading `)

let tmrID = setInterval(() => {
  dots += '.'
  process.stdout.write(`\rLoading ${dots}`)
}, 1000)

setTimeout(() => {
  clearInterval(tmrID)
  console.log(`\rLoaded in [3500 ms]`)
}, 3500)

通过将\r放置在下一个打印语句前面,光标将在替换字符串覆盖前一个之前重置。

这些解决方案都不适用于我,process.stdout.write('ok\033[0G'),只需使用'\r'即可创建新行,但不会在Mac OSX 10.9.2上覆盖。

编辑:我不得不用它来替换当前行:

process.stdout.write('\033[0G');
process.stdout.write('newstuff');