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 相关文章推荐
写的htc的数据表格
Jan 20 Javascript
js下利用控制器载入对应脚本
Jul 17 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
Aug 01 Javascript
JS获取当前脚本文件的绝对路径
Mar 02 Javascript
js css实现垂直方向自适应的三角提示菜单
Jun 26 Javascript
关于JavaScript和jQuery的类型判断详解
Oct 08 Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 Javascript
Vue不能检测到Object/Array更新的情况的解决
Jun 26 Javascript
新版小程序登录授权的方法
Dec 12 Javascript
解决vue-cli 打包后自定义动画未执行的问题
Nov 12 Javascript
JavaScript回调函数callback用法解析
Jan 14 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
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
初学python数组的处理代码
2011/01/04 Python
python求列表交集的方法汇总
2014/11/10 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
Python+微信接口实现运维报警
2016/08/27 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
python机器学习之神经网络实现
2018/10/13 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
护士自荐信范文
2013/12/15 职场文书
服务承诺口号
2014/05/22 职场文书
导游词之千岛湖
2019/09/23 职场文书
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server