Bagaimanakah anda boleh mengulangi tatasusunan besar tanpa menyekat utas UI?

Linda Hamilton
Lepaskan: 2024-11-04 06:38:02
asal
443 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan