1. 程式人生 > >處理瀏覽器端長時間執行JavaScript指令碼的兩種優化方式:定時器和worker

處理瀏覽器端長時間執行JavaScript指令碼的兩種優化方式:定時器和worker

第一種:定時器方式,把長時間的任務進行分割成一個數組,間隔一定的時間執行。
function timeProcessArray(items, process, callBack) {
  let todo = items.concat()
  setTimeout(function () {
    let time = +new Date()
    do {
      process(todo.shift())
    } while (todo.length && (+new Date() - time < 50))// 大於100毫秒時間就偏長了(UI執行緒會卡住,使用者會感覺到卡頓),最好小於這個值
    if 
(todo.length) { setTimeout(arguments.callee, 25) // 考慮定時器的解析度,window系統在定時器小於15秒IE會鎖定,卡住UI程序 } else { callBack(items) } }, 25) }

 
第二種:worker,瀏覽器開啟的一個新的執行緒,不涉及UI執行緒無關
// Worker執行環境有以下幾部分組成:
   // 1. 一個navigator物件,只包含四個屬性:appName,appVersion,userAgent和platform
   // 2. 一個location物件,(與window.location一樣,不過屬性只讀)
// 3. self物件,指向全域性的worker物件 // 4. 一個importScripts()方法,用來載入外部檔案到worder // 5. 所以ECMAScript物件,如 object,array // 6. XMLHttpRequest構造器 // 7. 定時器 // 8. 一個close方法,它能立即停止worker執行
// Web Workers適用於那些純資料處理,或者與UI無關的長時間執行指令碼
let worker = new Worker('./p3.js')
worker.onmessage = function (event) {
  console.log
(event.data) } worker.postMessage('zsn')

 

 
//p3
importScripts('p1.js', 'p2.js')
//該方法接受一個或多個JavaScript檔案URL路徑。importScripts的呼叫過程是阻塞式的,只有檔案載入執行後,指令碼才會繼續執行
 //由於worker在UI執行緒之外執行,所以這種阻塞不會影響UI響應
self.onmessage = function (event) {
  self.postMessage('hello ' + event.data)
}