JS+WCF實(shí)現(xiàn)進(jìn)度條實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)加載量的方法詳解
本文實(shí)例講述了JS+WCF實(shí)現(xiàn)進(jìn)度條實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)加載量的方法。分享給大家供大家參考,具體如下:
背景
由于項(xiàng)目中需要導(dǎo)入大量數(shù)據(jù)到memcache中
需要用WCF調(diào)取11萬條數(shù)據(jù),由于那邊多級(jí)聯(lián)查和排序,所以比較慢(1分鐘左右)
同時(shí)這邊需要對(duì)數(shù)據(jù)進(jìn)行處理,合并成2萬條數(shù)據(jù),然后存儲(chǔ),需要一定時(shí)間(也是1分鐘左右)
總之,完成這個(gè)數(shù)據(jù)導(dǎo)入一共需要1分30秒左右
這時(shí)候,需要一個(gè)進(jìn)度條來實(shí)時(shí)監(jiān)測(cè)完成的數(shù)據(jù)量
(之前用的是一個(gè)動(dòng)態(tài)圖,不能知道程序目前的完成量,甚至不知道它是不是卡住了,只能等著)
功能
1.開辟線程,用于加載數(shù)據(jù),處理數(shù)據(jù)
2.前臺(tái)實(shí)時(shí)讀取后臺(tái)數(shù)據(jù),并顯示
代碼
view-html
@* 數(shù)據(jù)準(zhǔn)備進(jìn)度條 *@ <div id="container"> <div class="content"> <h1>數(shù)據(jù)準(zhǔn)備</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>數(shù)據(jù)準(zhǔn)備完成!</p> </div> </div>
view-js
$(function () { $('#initialization').click(function () { $.messager.confirm('提示', '是否要進(jìn)行數(shù)據(jù)初始化?', 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(); }
后臺(tái)
static int load_data_amount;//當(dāng)前數(shù)據(jù)準(zhǔn)備量 public bool initializeData() { bool flag = false; //定義返回值 //獲得數(shù)據(jù) //code....code ....code.... load_data_amount = 5;//完成工作量 int page = 0; int amount = 50000;//一次獲取數(shù)據(jù)量不能超過10萬 while (page * amount == list.Count) { //code....code ....code.... load_data_amount = load_data_amount + 5; } load_data_amount = 50;//讀取數(shù)據(jù)默認(rèn)的工作量 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;//根據(jù)數(shù)據(jù)改變的完成工作量 } load_data_amount = 100;//完成工作量 flag = true; return flag; } //返回當(dāng)前準(zhǔn)備數(shù)據(jù)量 public int LoadDataAmount() { return load_data_amount; }
問題 & 解決
1.進(jìn)度條生成
解決:使用網(wǎng)上的demo,css+js可以動(dòng)態(tài)生成,改變數(shù)據(jù)即可
2.線程問題
解決:開始是監(jiān)測(cè)使用線程,后來改成處理數(shù)據(jù)使用線程
3.實(shí)時(shí)監(jiān)測(cè)問題
解決:處理數(shù)據(jù)使用線程自動(dòng)運(yùn)行,前臺(tái)使用ajax不斷查詢后臺(tái)的一個(gè)變量load_data_amount
4.ajax報(bào)錯(cuò)問題
注意是返回值的類型,以及是result還是result.d,不同情況下是不一樣的
5.數(shù)據(jù)類型問題
解決:讀取數(shù)據(jù)完成的百分比,是用 完成量/所有量 得到的,這里的數(shù)一直算不對(duì),是因?yàn)閕nt類型承受不住11萬的運(yùn)算以及之后的小數(shù),用double和float可以
小結(jié)
本來想著開個(gè)線程,加個(gè)變量,返回前臺(tái),加一個(gè)進(jìn)度條,讀取變量就OK了
但是中間的這個(gè)MVC,這個(gè)Spring,這個(gè)接口,之前的方法各種不好使,以及在它們下面的運(yùn)算,ajax……一個(gè)一個(gè)分開解決,最后還是解決了
分而治之,逐個(gè)解決,測(cè)試就好
另外,框架和合作在帶來便利的同時(shí),中間的限制和bug也會(huì)讓你的效率下降
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript時(shí)間與日期操作技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
Chrome擴(kuò)展頁面動(dòng)態(tài)綁定JS事件提示錯(cuò)誤
開發(fā)Chrome擴(kuò)展時(shí),頁面的popup.html中需要js的時(shí)候,直接將JS寫在動(dòng)態(tài)綁定JS事件會(huì)提示錯(cuò)誤,下面有個(gè)不錯(cuò)的解決方法,大家可以參考下2014-02-028 行 Node.js 代碼實(shí)現(xiàn)代理服務(wù)器
JavaScript 前后端通吃,在全棧開發(fā)領(lǐng)域具有獨(dú)特的優(yōu)勢(shì)。今天就來看看作為服務(wù)端語言的 JavaScript,完成一個(gè)簡(jiǎn)單的代理服務(wù)器功能是多么容易。2016-12-12基于JavaScript繪制動(dòng)態(tài)花束的示例代碼
p5.js 是一個(gè)JavaScript的函數(shù)庫,它在制作之初就和Processing有同樣的目標(biāo)。本文將利用p5.js 制作出一束動(dòng)態(tài)花束,感興趣的可以嘗試一下2022-06-06JS實(shí)現(xiàn)判斷有效的數(shù)獨(dú)算法示例
這篇文章主要介紹了JS實(shí)現(xiàn)判斷有效的數(shù)獨(dú)算法,結(jié)合實(shí)例形式分析了javascript數(shù)獨(dú)判斷的原理及相關(guān)算法實(shí)現(xiàn)、使用操作技巧,需要的朋友可以參考下2019-02-02