nodejs 终端打印进度条实例代码


Posted in NodeJs onApril 22, 2017

1. 场景导入

当我们对大量文件进行批量处理的时候(例如:上传/下载、保存、编译等),常常希望知道当前进展如何,或者失败(成功)的任务有多少;当我们的代码或程序已经发布,用户在执行安装的过程中,一个合适的(终端/命令行)进度条可以准确反映安装的步骤和进程,提升程序的可用性,一定程度缓解用户在等待中的烦恼……

2. 基本原理

首先,在终端打印出文本是件比较容易的事情。那么使用简单的文本和符号,就够自己拼凑出命令行的效果(下面例子):

文件已上传: 43.60% ?????????????????????░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 150/344

当然,进度条的效果可以根据需要自己设计啦,我这里只是给大家一个参考。

这里,我将打印命令行的方法构造成一个工具模块 progress-bar.js,具体实现如下 :-)

// 这里用到一个很实用的 npm 模块,用以在同一行打印文本
var slog = require('single-line-log').stdout;

// 封装的 ProgressBar 工具
function ProgressBar(description, bar_length){
 // 两个基本参数(属性)
 this.description = description || 'Progress';    // 命令行开头的文字信息
 this.length = bar_length || 25;           // 进度条的长度(单位:字符),默认设为 25

 // 刷新进度条图案、文字的方法
 this.render = function (opts){
  var percent = (opts.completed / opts.total).toFixed(4);  // 计算进度(子任务的 完成数 除以 总数)
  var cell_num = Math.floor(percent * this.length);       // 计算需要多少个 ? 符号来拼凑图案

  // 拼接黑色条
  var cell = '';
  for (var i=0;i<cell_num;i++) {
   cell += '?';
  }

  // 拼接灰色条
  var empty = '';
  for (var i=0;i<this.length-cell_num;i++) {
   empty += '░';
  }

  // 拼接最终文本
  var cmdText = this.description + ': ' + (100*percent).toFixed(2) + '% ' + cell + empty + ' ' + opts.completed + '/' + opts.total;
  
  // 在单行输出文本
  slog(cmdText);
 };
}

// 模块导出
module.exports = ProgressBar;

3. Run 起来

基于上面的实现,先说一下这个 progress-bar.js 的用法:

// 引入工具模块
var ProgressBar = require('./progress_bar');

// 初始化一个进度条长度为 50 的 ProgressBar 实例
var pb = new ProgressBar('下载进度', 50);

// 这里只是一个 pb 的使用示例,不包含任何功能
var num = 0, total = 200;
function downloading() {
 if (num <= total) {
  // 更新进度条
  pb.render({ completed: num, total: total });

  num++;
  setTimeout(function (){
   downloading();
  }, 500)
 }
}
downloading();

run 一下上面的代码,执行效果如下:

nodejs 终端打印进度条实例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
详解Nodejs内存治理
May 13 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 NodeJs
浅谈Node的内存泄露问题
May 06 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 #NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 #NodeJs
解析NodeJS异步I/O的实现
Apr 13 #NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 #NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 #NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 #NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 #NodeJs
You might like
php设计模式 Visitor 访问者模式
2011/06/28 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
如何理解python面向对象编程
2020/06/01 Python
没编程基础可以学python吗
2020/06/17 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
初婚未育证明
2014/01/15 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
会计顶岗实习心得
2014/01/25 职场文书
上诉答辩状范文
2015/05/22 职场文书
大学生见习总结报告
2015/06/24 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers