Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimanakah anda boleh mengulangi tatasusunan besar tanpa menyekat utas UI?

Bagaimanakah anda boleh mengulangi tatasusunan besar tanpa menyekat utas UI?

Linda Hamilton
Linda Hamiltonasal
2024-11-04 06:38:02444semak imbas

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

Strategi Lelaran Tatasusunan Tidak Menyekat

Apabila melelaran pada tatasusunan yang besar, adalah penting untuk mengelak daripada menyekat urutan UI dan menjejaskan pengalaman pengguna. Artikel ini meneroka pelbagai strategi untuk mencapai lelaran tanpa sekatan tanpa menggunakan pekerja web dan dengan penggunaan pekerja web.

Tanpa Pekerja Web

Untuk kod yang perlu berinteraksi dengan DOM, penyelesaian biasa ialah memecahkan lelaran kepada ketulan yang lebih kecil dan memprosesnya secara tidak segerak menggunakan pemasa. Ini membolehkan penyemak imbas memproses acara lain, memastikan UI responsif.

<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>

Secara bergantian, anda boleh menentukan fungsi yang lebih generik yang menerima fungsi panggil balik untuk memproses setiap elemen:

<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>

Untuk mengelakkan meneka saiz bahagian optimum, anda boleh menggunakan pendekatan berasaskan selang:

<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>

Dengan Pekerja Web

Pekerja web menawarkan penyelesaian lain apabila lelaran kod tidak memerlukan akses DOM. Kod yang memakan masa dialihkan ke fail skrip yang berasingan dan dijalankan dalam urutan pekerja. Setelah selesai, pekerja boleh menyiarkan hasil kembali ke urutan utama tanpa menghalang pemprosesan acara.

Atas ialah kandungan terperinci Bagaimanakah anda boleh mengulangi tatasusunan besar tanpa menyekat utas UI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn