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的10个性能优化技巧
Jul 15 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
初探nodeJS
Jan 24 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
linux 下以二进制的方式安装 nodejs
Feb 12 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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/06/30 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
微信小程序自定义导航栏
2018/12/31 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
keep-alive不能缓存多层级路由菜单问题解决
2020/03/10 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
Python中文件操作简明介绍
2015/04/13 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
学期自我评价
2014/01/27 职场文书
小学校园活动策划
2014/01/30 职场文书
集中整治工作方案
2014/05/01 职场文书
个人整改措施书面材料
2014/10/24 职场文书
暂停营业通知
2015/04/25 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
七年级作文之英语老师
2019/10/28 职场文书