>  기사  >  웹 프론트엔드  >  UI 스레드를 차단하지 않고 어떻게 대규모 배열을 반복할 수 있나요?

UI 스레드를 차단하지 않고 어떻게 대규모 배열을 반복할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-04 06:38:02444검색

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

비차단 배열 반복 전략

대규모 배열을 반복할 때 UI 스레드를 차단하고 사용자 경험을 저하시키지 않는 것이 중요합니다. 이 기사에서는 웹 워커를 사용하지 않고 웹 워커를 사용하여 비차단 반복을 달성하기 위한 다양한 전략을 살펴봅니다.

웹 워커 없이

상호작용이 필요한 코드의 경우 DOM을 사용하는 경우 일반적인 솔루션은 반복을 더 작은 덩어리로 나누고 타이머를 사용하여 비동기식으로 처리하는 것입니다. 이렇게 하면 브라우저가 다른 이벤트를 처리하여 UI의 응답성을 유지할 수 있습니다.

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

또는 각 요소를 처리하기 위해 콜백 함수를 허용하는 보다 일반적인 함수를 정의할 수 있습니다.

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

최적의 청크 크기를 추측하지 않으려면 간격 기반 접근 방식을 사용할 수 있습니다.

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

웹 작업자 사용

웹 작업자는 반복 시 다른 솔루션을 제공합니다. 코드에는 DOM 액세스가 필요하지 않습니다. 시간이 많이 걸리는 코드는 별도의 스크립트 파일로 이동되어 작업자 스레드에서 실행됩니다. 완료되면 작업자는 이벤트 처리를 방해하지 않고 결과를 다시 메인 스레드에 게시할 수 있습니다.

위 내용은 UI 스레드를 차단하지 않고 어떻게 대규모 배열을 반복할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.