清除行
进度打印的第一步是实现单行打印,而这就需要实现如何删除当前前n行内容:
const MOVE_LEFT = Buffer.from('1b5b3130303044', 'hex').toString();
const MOVE_UP = Buffer.from('1b5b3141', 'hex').toString();
const CLEAR_LINE = Buffer.from('1b5b304b', 'hex').toString();
function clearnLine(n){
for (let index = 0; index < n; index++) {
process.stdout.write(MOVE_LEFT + CLEAR_LINE + MOVE_UP);
}
}
实现单行打印
基于“清除行”开发单行打印就很容易了:
// 用来记录前置有多少行需要回退
let prevLineCount = 0;
// 返回实际同行打印的方法
const lineLog = function (text) {
clearnLine(prevLineCount); // 清除屏幕
console.log(text); // 打印
prevLineCount = text.split('\n').length; // 重新计算需要回滚多少行
}
有时候,一行文本可能有点多,会进行换行,因此一行文本 linetext 实际需要回滚多少行,还可以进一步进行计算: linetext / process.stdout.columns ,取其和1的最大值即可(因为还可能是空行)。
进度打印
现在,是时候实现进度打印了:
/**
* 进度打印
* @param { number } percentum 进度0-100
* @param { string } text 说明文字,可选择
*/
const processLog = function (percentum, text) {
if (arguments.length <= 1) text = "";
let txt = "",i = 0;
// 补充已经有的进度
for (; i <= percentum && i <= 100; i += 5) { txt += "█"; }
// 补充余下的空白
for (; i <= 100; i += 5) { txt += "░";}
lineLog(percentum.toFixed(2) + "%[" + txt + "]" + text);
};
使用例子
let deep = 0;
let interval = setInterval(function () {
deep += Math.random() * 3;
if (deep >= 100) {
clearInterval(interval);
deep = 100;
}
processLog(deep, "正在加载文件,请稍等片刻");
}, 200);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。