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

Comment pouvez-vous parcourir de grands tableaux sans bloquer le thread de l'interface utilisateur ?

Linda Hamilton
Libérer: 2024-11-04 06:38:02
original
443 Les gens l'ont consulté

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

Stratégies d'itération de tableau non bloquantes

Lors d'une itération sur de grands tableaux, il est crucial d'éviter de bloquer le thread de l'interface utilisateur et de compromettre l'expérience utilisateur. Cet article explore diverses stratégies pour réaliser une itération non bloquante sans utiliser de Web Workers et avec l'utilisation de Web Workers.

Sans Web Workers

Pour le code qui doit interagir avec le DOM, une solution courante consiste à diviser l'itération en morceaux plus petits et à les traiter de manière asynchrone à l'aide de minuteries. Cela permet au navigateur de traiter d'autres événements, gardant l'interface utilisateur réactive.

<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>
Copier après la connexion

Vous pouvez également définir une fonction plus générique qui accepte une fonction de rappel pour traiter chaque élément :

<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>
Copier après la connexion

Pour éviter de deviner la taille optimale des morceaux, vous pouvez utiliser une approche basée sur les intervalles :

<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>
Copier après la connexion

Avec les Web Workers

Les Web Workers proposent une autre solution lorsque l'itération le code n'a pas besoin d'un accès au DOM. Le code fastidieux est déplacé vers un fichier de script distinct et s'exécute dans un thread de travail. Une fois terminé, le travailleur peut publier les résultats dans le thread principal sans entraver le traitement des événements.

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