首頁  >  文章  >  web前端  >  如何在不阻塞 UI 執行緒的情況下迭代大型數組?

如何在不阻塞 UI 執行緒的情況下迭代大型數組?

Linda Hamilton
Linda Hamilton原創
2024-11-04 06:38:02444瀏覽

How can you iterate over large arrays without blocking the UI thread?

非阻塞數組迭代策略

迭代大型數組時,避免阻塞 UI 線程並影響用戶體驗至關重要。本文探討了不使用 Web Workers 和使用 Web Workers 實現非阻塞迭代的各種策略。

不使用Web Workers

對於需要互動的程式碼對於DOM,一個常見的解決方案是將迭代分成更小的區塊並使用計時器非同步處理它們。這允許瀏覽器處理其他事件,保持 UI 回應。

<code class="javascript">function processLargeArray(array) {
  // Chunk size for processing
  var chunk = 100;
  var index = 0;

  function doChunk() {
    var cnt = chunk;
    while (cnt-- && index < array.length) {
      // Process array[index] here
      ++index;
    }
    if (index < array.length) {
      // Set timeout for async iteration
      setTimeout(doChunk, 1);
    }
  }

  doChunk();
}</code>

或者,您可以定義一個更通用的函數,它接受處理每個元素的回調函數:

<code class="javascript">function processLargeArrayAsync(array, fn, chunk, context) {
  context = context || window;
  chunk = chunk || 100;
  var index = 0;

  function doChunk() {
    var cnt = chunk;
    while (cnt-- && index < array.length) {
      // Call the callback with args (value, index, array)
      fn.call(context, array[index], index, array);
      ++index;
    }
    if (index < array.length) {
      // Set timeout for async iteration
      setTimeout(doChunk, 1);
    }
  }

  doChunk();
}</code>

為了避免猜測最佳區塊大小,您可以使用間隔為基礎的方法:

<code class="javascript">function processLargeArrayAsync(array, fn, maxTimePerChunk, context) {
  context = context || window;
  maxTimePerChunk = maxTimePerChunk || 200;
  var index = 0;

  function now() {
    return new Date().getTime();
  }

  function doChunk() {
    var startTime = now();
    while (index < array.length && (now() - startTime) <= maxTimePerChunk) {
      // Call the callback with args (value, index, array)
      fn.call(context, array[index], index, array);
      ++index;
    }
    if (index < array.length) {
      // Set timeout for async iteration
      setTimeout(doChunk, 1);
    }
  }

  doChunk();
}</code>

使用Web Workers

Web Workers 在迭代時提供另一種解決方案程式碼不需要 DOM 存取。耗時的程式碼被移至單獨的腳本檔案並在工作執行緒中運行。完成後,工作人員可以將結果發布回主線程,而不會妨礙事件處理。

以上是如何在不阻塞 UI 執行緒的情況下迭代大型數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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