Maison > interface Web > js tutoriel > le corps du texte

Comment itérer de grands tableaux en JavaScript sans bloquer l'interface utilisateur ?

Patricia Arquette
Libérer: 2024-11-04 21:16:02
original
325 Les gens l'ont consulté

How to Iterate Large Arrays in JavaScript Without Blocking the UI?

Itérer de grands tableaux de manière asynchrone sans bloquer l'interface utilisateur

Introduction

Itérer sur de grands tableaux en JavaScript peut être difficile, en particulier lorsque l’interface utilisateur doit rester réactive. Le blocage de l'interface utilisateur peut entraîner une mauvaise expérience utilisateur. Cet article explore différentes approches pour itérer sur de grands tableaux sans interrompre l'interface utilisateur.

Sans Web Workers

Lorsque vous travaillez avec du code qui doit accéder au DOM ou qui interagit fortement avec autre état de l'application, les Web Workers ne peuvent pas être utilisés. Une solution pratique consiste à diviser l’itération en morceaux plus petits et à les exécuter selon une minuterie. Cela permet au navigateur de traiter d'autres événements entre les morceaux, en maintenant la réactivité de l'interface utilisateur.

Le code suivant illustre cette approche :

<code class="js">function processLargeArray(array) {
  // Customizable chunk size
  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>
Copier après la connexion

Ce code peut être généralisé davantage pour appeler une fonction de rappel similaire à Array.forEach() avec une taille de morceau personnalisable :

<code class="js">function processLargeArrayAsync(array, fn, chunk, context) {
  // Customizable chunk size
  chunk = chunk || 100;
  var index = 0;

  function doChunk() {
    var cnt = chunk;
    while (cnt-- && index < array.length) {
      // Callback called 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>
Copier après la connexion

Avec Web Workers

Si le code n'a pas besoin d'accéder au DOM, un Web Worker peut être utilisé. Un Web Worker s'exécute indépendamment du thread principal, ce qui lui permet d'exécuter des tâches de longue durée de manière asynchrone.

Tout d'abord, le code qui s'exécutera dans le Web Worker doit être isolé dans un script distinct. Ensuite, les étapes suivantes peuvent être suivies :

  1. Créez un nouvel objet Web Worker et spécifiez l'URL du script :

    <code class="js">var webWorker = new Worker('worker.js');</code>
    Copier après la connexion
  2. Gérer l'événement de message reçu du Web Worker lorsqu'il a terminé sa tâche :

    <code class="js">webWorker.onmessage = function(e) {
      // Handle the result
    };</code>
    Copier après la connexion
  3. Envoyer les données au Web Worker pour traitement :

    <code class="js">webWorker.postMessage({ data: array });</code>
    Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal