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 相关文章推荐
关于锚点跳转及jQuery下相关操作与插件
Oct 01 Javascript
JQuery的AJAX实现文件下载的小例子
May 15 Javascript
JavaScript中textRange对象使用方法小结
Mar 24 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
Dec 06 Javascript
Jquery插件easyUi实现表单验证示例
Dec 15 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
Dec 23 Javascript
Web Uploader文件上传插件使用详解
May 10 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
详解angular脏检查原理及伪代码实现
Jun 08 Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 Javascript
vue+iview实现文件上传
Nov 17 Vue.js
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
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
jquery键盘事件使用介绍
2011/11/01 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
Vue.use源码分析
2017/04/22 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
python3个性签名设计实现代码
2018/06/19 Python
python opencv实现运动检测
2018/07/10 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
英国网上花店:Bunches
2016/11/29 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
十八届三中全会感言
2014/03/10 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
论语读书笔记
2015/06/26 职场文书
初中语文教学研修日志
2015/11/13 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers