Sobes.tech
Middle

Ένα πίνακας με 2 εκατομμύρια στοιχεία φτάνει, κάθε στοιχείο πρέπει να επεξεργαστεί για 100 χιλιοστά του δευτερολέπτου. Η αλληλεπίδραση με τον διακομιστή δεν μπορεί να αλλάξει. Πώς να επεξεργαστείτε αυτόν τον πίνακα ώστε να μην μπλοκάρει το UI;

sobes.tech AI

Απάντηση από AI

Чтобы обработать большой массив с длительной обработкой каждого элемента и не блокировать UI, нужно разбить работу на небольшие части и выполнять их асинхронно, позволяя браузеру обновлять интерфейс между партиями.

Пример подхода с использованием setTimeout или requestIdleCallback:

function processChunk(array, start, chunkSize) {
  const end = Math.min(start + chunkSize, array.length);
  for (let i = start; i < end; i++) {
    // Обработка элемента, занимает ~100ms
    processElement(array[i]);
  }
  if (end < array.length) {
    setTimeout(() => processChunk(array, end, chunkSize), 0);
  }
}

processChunk(largeArray, 0, 10); // обрабатываем по 10 элементов за раз

Так UI не будет заморожен, так как между партиями даётся время на отрисовку и обработку событий.

Если доступен Web Worker, можно вынести обработку туда, чтобы не блокировать главный поток.