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 相关文章推荐
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
Nodejs全局安装和本地安装的不同之处
Jul 04 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 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验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
类之Prototype.js学习
2007/06/13 Javascript
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JavaScript Split()方法
2015/12/18 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python读写unicode文件的方法
2015/07/10 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
python如何实现内容写在图片上
2018/03/23 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
详解python中的Turtle函数库
2018/11/19 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
Python数据可视化图实现过程详解
2020/06/12 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
港湾网络笔试题
2014/04/19 面试题
科室工作个人总结的自我评价
2013/10/29 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
爱国口号
2014/06/19 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
Windows server 2016服务器基本设置
2022/08/14 Servers