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 sublime text 3安装与配置
Jun 19 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
Nodejs让异步变成同步的方法
Mar 02 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
NodeJS实现一个聊天室功能
Nov 25 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脚本的10个技巧(3)
2006/10/09 PHP
模仿OSO的论坛(二)
2006/10/09 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
Python实现简单的代理服务器
2015/07/25 Python
python运行其他程序的实现方法
2017/07/14 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
django列表筛选功能的实现代码
2020/03/27 Python
浅谈Python中的继承
2020/06/19 Python
夜大自我鉴定
2013/10/31 职场文书
八一建军节活动方案
2014/02/10 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
新年寄语大全
2014/04/12 职场文书
2015年教学工作总结
2015/04/02 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
班级班风口号大全
2015/12/25 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript
nginx静态资源的服务器配置方法
2022/07/07 Servers