首頁 >web前端 >js教程 >JS+WCF實現進度條功能

JS+WCF實現進度條功能

小云云
小云云原創
2017-12-20 09:37:471432瀏覽

本文主要介紹了JS+WCF實現進度條實時監測數據加載量的方法,結合實例形式分析了大量數據導入過程中前台js與後台WCF交互實現實時顯示加載進度的相關操作技巧,需要的朋友可以參考下,希望能幫助大家。

背景

由於專案中需要匯入大量資料到memcache中

需要用WCF調取11萬個數據,由於那邊多級聯查和排序,所以比較慢(1分鐘左右)

同時這邊需要對數據進行處理,合併成2萬條數據,然後存儲,需要一定時間(也是1分鐘左右)

總之,完成這個資料導入一共需要1分30秒左右

這時候,需要一個進度條來即時監測完成的資料量

(之前用的是一個動態圖,不能知道程式目前的完成量,甚至不知道它是不是卡住了,只能等著)

功能


#1.開闢線程,用於載入數據,處理數據
2.前台即時讀取後台數據,並顯示

##代碼


#view-html


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

view-js


#
$(function () {
    $(&#39;#initialization&#39;).click(function () {
      $.messager.confirm(&#39;提示&#39;, &#39;是否要进行数据初始化?&#39;, function (r) {
        if (!r) {
          return;
        }
        else {
          $(&#39;#container&#39;).show();
          var t1 = window.setInterval(process_bar, 1500);
        }
      });
    });
});
function process_bar() {
    $.ajax({
      type: "POST",
      async: true,
      url: "/Paper/LoadData",
      success: function (result) {
        $(&#39;#progress_bar .ui-progress&#39;).animateProgress(result);
        if (result =="100") {
          $(&#39;#main_content&#39;).slideDown();
          $(&#39;#fork_me&#39;).fadeIn();
          setTimeout(function () { $(&#39;#container&#39;).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實作進度列的原生程式碼#############JS原生上傳大檔案顯示進度列-php上傳檔案# ###########php中關於進度條函數的實例分析######

以上是JS+WCF實現進度條功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn