中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中怎么利用setTimeout防止循環超時

發布時間:2021-07-21 11:39:10 來源:億速云 閱讀:272 作者:Leah 欄目:web開發

今天就跟大家聊聊有關JavaScript中怎么利用setTimeout防止循環超時,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

JS是單線程的,一個代碼塊里面的代碼,只能按順序從上到下執行,所以如果中間有一塊代碼,執行起來非常耗時,就會導致下面的代碼無法執行,出現瀏覽器假死的狀態。

JS的耗時操作,常見的有兩種  1.向服務器發起請求   2.對數組的循環操作  (當然,還有一種,就是把1和2合在一起,叫做  在循環操作里面向服務器發出請求,哈哈哈,實際項目里面經常有人這么干)

解決這兩種耗時操作的思路都是一樣的——異步編程。JS的異步編程,并不是多線程,因為正如上面所說的,JS是單線程的。JS的異步,直觀上的理解,就是延時和回調

對于第一種耗時情況,我們采用的是ajax異步請求,待耗時的請求返回結果時,進行回調操作。

對于第二種耗時情況,則可以使用本文即將介紹的方法,setTimeout延時調用,進行數組分塊處理

【這才是高潮】

假設我們要處理一個大小為100的數組,對于數組中每個元素,都需要執行大量的處理,每個元素大約需要1s的處理時間;

并且我們認為,程序后面的代碼,不會依賴于我們對這個數組的處理結果。

于是就有了下面這段代碼,以兩種方式來處理這個數組,一種是常規方式,一種是setTImeout的數組分塊處理

var processTime = 0;
//常規操作
tcCircle();
//注釋上面的代碼 放開下面注釋 以執行setTimeout數組分塊操作
//tcCircleUseSetTimeout();
//time consuming circle
function tcCircle(){
  var arr = new Array(100);
  for(var i=0;i<arr.length;i++){
    process(arr[i]);
  }
  //頁面標題欄一直轉圈 且下面的語句遲遲無法執行
  console.log("important process");
  console.log("finish!");
}
function tcCircleUseSetTimeout(){
  var arr = new Array(100);
  setTimeout(function(){
    var ele = arr.shift();
    process(ele);
    if(arr.length>0){
      setTimeout(arguments.callee,100);
    }
  },100);
  console.log("important process");
  console.log("finish!");
}
function process(ele){
  console.log("process"+(++processTime));
  //模擬長時間的處理過程
  sleep(1000);
}
function sleep(sleepTime){
  var start=new Date().getTime();
  while(true){
    if(new Date().getTime()-start>sleepTime){
      break;  
    }
  }
}

首先我們執行常規的操作,由于是單線程,可想而知,執行完這段程序,至少要 1*100 = 100s,并且瀏覽器會出現假死

JavaScript中怎么利用setTimeout防止循環超時

然后我們執行setTimeout方式的方法,setTImeout的方式,我們每次只操作數組里面的一個對象,并且在每次操作之間,設置了100ms的延時,供js引擎執行主干的代碼,因此,很明顯,執行的效果非常棒!

JavaScript中怎么利用setTimeout防止循環超時

看完上述內容,你們對JavaScript中怎么利用setTimeout防止循環超時有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阆中市| 偏关县| 涪陵区| 肇源县| 彭泽县| 库尔勒市| 临沧市| 林口县| 石阡县| 依安县| 会泽县| 武川县| 红安县| 武功县| 昭苏县| 综艺| 深泽县| 左云县| 苏州市| 常州市| 根河市| 银川市| 清水县| 丘北县| 武定县| 扶沟县| 扶绥县| 内黄县| 廊坊市| 清涧县| 咸宁市| 镇宁| 钦州市| 宁德市| 通道| 安陆市| 集安市| 酒泉市| 若羌县| 象山县| 隆安县|