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 相关文章推荐
javascript Array.sort() 跨浏览器下需要考虑的问题
Dec 07 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
Jan 28 Javascript
JavaScript实现拼音排序的方法
Nov 20 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
Feb 26 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
Dec 23 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
Aug 26 Javascript
JavaScript+CSS无限极分类效果完整实现方法
Dec 22 Javascript
浅谈Web页面向后台提交数据的方式和选择
Sep 23 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
ES2020系列之空值合并运算符 '??'
Jul 22 Javascript
uin-app+mockjs实现本地数据模拟
Aug 26 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP 压缩文件夹的类代码
2009/11/05 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
python基础教程之面向对象的一些概念
2014/08/29 Python
安装dbus-python的简要教程
2015/05/05 Python
Python快速排序算法实例分析
2017/11/29 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
小学生评语集锦
2014/04/18 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
优秀党员先进材料
2014/12/18 职场文书
烈士陵园观后感
2015/06/08 职场文书
详解OpenCV曝光融合
2022/04/29 Python