gpt4 book ai didi

node.js - NodeJS 脚本在控制台中显示每行更新

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:59 26 4
gpt4 key购买 nike

我有一个用 NodeJS 编写的小型命令行程序来处理给定目录中的所有文本文件。由于 Node 是异步的,脚本将读取所有文件,处理它们并输出如下内容

Converting file: example-file-1.txt
Converting file: example-file-2.txt
Converting file: example-file-3.txt
Converting file: example-file-4.txt
File example-file-3.txt converted!
File example-file-1.txt converted!
File example-file-2.txt converted!
File example-file-4.txt converted!

这不是很漂亮,“转换后的”消息不按顺序排列,因为文件大小不同并且以不同的速度完成处理。
我希望看到的是这样的

File example-file-1.txt: DONE! // processing of this file has finished
File example-file-2.txt: converting... // this file is still processing
File example-file-3.txt: DONE!
File example-file-4.txt: converting...

每行最右边的部分应该随着进度动态更新。

我在这里真正要问的是如何在控制台中显示几行消息,我可以随着脚本的进展更新这些消息?

最佳答案

终端

使用标准终端功能,只有回车符 \r 允许将光标重置到当前行的开头并覆盖它以进行更新。

大多数终端支持 ANSI/VT100 控制代码,允许设置颜色、光标定位和其他屏幕更新。使用这些的 Node 模块例如:

  • charm :使用ansi终端字符书写颜色和光标位置。
  • blessed :一个类似curses的库,具有用于node.js的高级终端接口(interface)API。

Windows 支持转义序列 after some tweaks .

最小示例

以下示例通过直接发送控制命令并写出缓存的屏幕来解决该任务。使用的命令是:

  1. 通过发送 \x1b[H
  2. 将光标重新定位在左上角
  3. 通过发送\x1b[2J来清除屏幕。

写入的行数超过可用行数将导致闪烁。

var progress = {
'example-file-1.txt': 'converting',
'example-file-2.txt': 'converting',
'example-file-3.txt': 'converting'
}

function renderProgress() {
// reset cursor, clear screen, do not write a new line
process.stdout.write('\x1b[H\x1b[2J')

// render progress
Object.keys(progress).forEach(filename => console.log(`${filename}: ${progress[filename]}`))
}

function updateProgress(filename, status) {
progress[filename] = status
renderProgress()
}

// render initial progress
renderProgress()

// simulare updates
setTimeout(() => updateProgress('example-file-2.txt', 'done'), 1000)
setTimeout(() => updateProgress('example-file-1.txt', 'reconsidering'), 2500)
setTimeout(() => updateProgress('example-file-3.txt', 'done'), 4000)
setTimeout(() => updateProgress('example-file-1.txt', 'done'), 6000)

关于node.js - NodeJS 脚本在控制台中显示每行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48561317/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com