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教程之制作一个简单的文章发布系统
Nov 21 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
监控Nodejs的性能实例代码
Jul 02 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+mysql一个名片库程序
2006/10/09 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
JS动态生成年份和月份实例代码
2017/02/04 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
北大研究生linux应用求职信
2013/10/29 职场文书
乔迁宴答谢词
2014/01/21 职场文书
酒店大堂副理的职责范文
2014/02/13 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
《画风》教学反思
2014/04/16 职场文书
白血病募捐倡议书
2014/05/14 职场文书
保安公司服务承诺书
2014/05/28 职场文书
遗嘱格式范本
2015/08/07 职场文书