JS+WCF实现进度条实时监测数据加载量的方法详解


Posted in Javascript onDecember 19, 2017

本文实例讲述了JS+WCF实现进度条实时监测数据加载量的方法。分享给大家供大家参考,具体如下:

背景

由于项目中需要导入大量数据到memcache中

需要用WCF调取11万条数据,由于那边多级联查和排序,所以比较慢(1分钟左右)

同时这边需要对数据进行处理,合并成2万条数据,然后存储,需要一定时间(也是1分钟左右)

总之,完成这个数据导入一共需要1分30秒左右

这时候,需要一个进度条来实时监测完成的数据量

(之前用的是一个动态图,不能知道程序目前的完成量,甚至不知道它是不是卡住了,只能等着)

功能

1.开辟线程,用于加载数据,处理数据
2.前台实时读取后台数据,并显示

代码

view-html

@* 数据准备进度条 *@
  <div id="container">
    <div class="content">
      <h1>数据准备</h1>
    </div>
    <!-- Progress bar -->
    <div id="progress_bar" class="ui-progress-bar ui-container">
      <div class="ui-progress" style="width: 3%;">
        <span class="ui-label" style="display: none;">完成量<b class="value">3%</b></span>
      </div>
    </div>
    <!-- /Progress bar -->
    <div class="content" id="main_content" style="display: none;">
      <p>数据准备完成!</p>
    </div>
  </div>

view-js

$(function () {
    $('#initialization').click(function () {
      $.messager.confirm('提示', '是否要进行数据初始化?', function (r) {
        if (!r) {
          return;
        }
        else {
          $('#container').show();
          var t1 = window.setInterval(process_bar, 1500);
        }
      });
    });
});
function process_bar() {
    $.ajax({
      type: "POST",
      async: true,
      url: "/Paper/LoadData",
      success: function (result) {
        $('#progress_bar .ui-progress').animateProgress(result);
        if (result =="100") {
          $('#main_content').slideDown();
          $('#fork_me').fadeIn();
          setTimeout(function () { $('#container').hide();; }, 1500);
          window.clearInterval(t1);
        }
      }
    })
}

controller

static bool flag = true;
public int LoadData()
{
  int result = Ipaperbll.LoadDataAmount();
  if (flag)
  {
    Thread thread = new Thread(new ThreadStart(ThreadLoadData));
    thread.Start();
    flag = false;
  }
  return result;
}
private void ThreadLoadData()
{
  Ipaperbll.initializeData();
}

后台

static int load_data_amount;//当前数据准备量
public bool initializeData()
{
  bool flag = false;  //定义返回值
  //获得数据
  //code....code ....code....
  load_data_amount = 5;//完成工作量
  int page = 0;
  int amount = 50000;//一次获取数据量不能超过10万
  while (page * amount == list.Count)
  {
    //code....code ....code....
    load_data_amount = load_data_amount + 5;
  }
  load_data_amount = 50;//读取数据默认的工作量
  double totalamount = list.Count();
  foreach (var item in list)
  {
    //code....code ....code....
    load_data_amount = Convert.ToInt32((1 - (totalamount--) / double.Parse(list.Count().ToString())) * 50) + 50;//根据数据改变的完成工作量
  }
  load_data_amount = 100;//完成工作量
  flag = true;
  return flag;
}
//返回当前准备数据量
public int LoadDataAmount() {
  return load_data_amount;
}

问题 & 解决

1.进度条生成

解决:使用网上的demo,css+js可以动态生成,改变数据即可

2.线程问题

解决:开始是监测使用线程,后来改成处理数据使用线程

3.实时监测问题

解决:处理数据使用线程自动运行,前台使用ajax不断查询后台的一个变量load_data_amount

4.ajax报错问题

注意是返回值的类型,以及是result还是result.d,不同情况下是不一样的

5.数据类型问题

解决:读取数据完成的百分比,是用 完成量/所有量 得到的,这里的数一直算不对,是因为int类型承受不住11万的运算以及之后的小数,用double和float可以

小结

本来想着开个线程,加个变量,返回前台,加一个进度条,读取变量就OK了

但是中间的这个MVC,这个Spring,这个接口,之前的方法各种不好使,以及在它们下面的运算,ajax……一个一个分开解决,最后还是解决了

分而治之,逐个解决,测试就好

另外,框架和合作在带来便利的同时,中间的限制和bug也会让你的效率下降

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
js中的布尔运算符使用介绍
Nov 20 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
Aug 10 Javascript
jQuery中$.click()无效问题分析
Jan 29 Javascript
javascript定时器完整实例
Feb 10 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
JavaScript的继承实现小结
May 07 Javascript
JavaScript实现简单评论功能
Aug 17 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 Javascript
关于ES6尾调用优化的使用
Sep 11 Javascript
jquery自定义显示消息数量
Dec 19 #jQuery
基于Vue开发数字输入框组件
Dec 19 #Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 #jQuery
从setTimeout看js函数执行过程
Dec 19 #Javascript
mongoose更新对象的两种方法示例比较
Dec 19 #Javascript
jquery中done和then的区别(详解)
Dec 19 #jQuery
JavaScript实现AOP详解(面向切面编程,装饰者模式)
Dec 19 #Javascript
You might like
PHP 文件系统详解
2012/09/13 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
js活用事件触发对象动作
2008/08/10 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
JavaScript中的类型检查
2020/02/03 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
python修改字典键(key)的方法
2019/08/05 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
Python类中self参数用法详解
2020/02/13 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
如何理解委托
2012/01/06 面试题
大一自我鉴定范文
2013/12/27 职场文书
初中数学教学反思
2014/01/16 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
毕业生面试求职信
2014/06/23 职场文书