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——入门必看攻略
Jun 27 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 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插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
PHP 转义使用详解
2013/07/15 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
json简单介绍
2008/06/10 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
Python实现的tab文件操作类分享
2014/11/20 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
详解Python自建logging模块
2018/01/29 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
python爬取指定微信公众号文章
2018/12/20 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
Python实现代码统计工具
2019/09/19 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
高三自我鉴定范文
2013/10/19 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书