清除行

进度打印的第一步是实现单行打印,而这就需要实现如何删除当前前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);

zxl20070701
136 声望14 粉丝