ホームページ  >  記事  >  ウェブフロントエンド  >  大規模な配列を処理するときに UI の応答性を確保するにはどうすればよいですか?

大規模な配列を処理するときに UI の応答性を確保するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 10:59:30810ブラウズ

How to Ensure a Responsive UI When Processing Large Arrays?

応答しない UI 操作の非同期反復

大規模な配列を反復処理し、ユーザー操作を妨げる可能性のある長時間の操作を実行する場合、次のことを採用することが重要になります。ユーザー インターフェイスの応答性を維持する戦略。このガイドでは、Web ワーカーを使用する場合と使用しない場合の両方で、これを達成するための 2 つのアプローチを説明します。

非 WebWorker ソリューション

DOM 操作やその他の状態依存タスクを含む操作の場合、 Web ワーカーを使用するのは非現実的です。推奨されるアプローチは、作業を小さなチャンクに分割し、タイマーを使用して非同期に実行することです。これにより、ブラウザーは各チャンク間でイベントを処理し、UI を更新できるようになり、ユーザー入力と表示更新の中断を防ぎます。

以下のコードは、この手法を示しています。

<code class="javascript">function processLargeArray(array) {
    // Process 100 items per chunk
    var chunkSize = 100;
    var index = 0;
    function doChunk() {
        for (var i = 0; i < chunkSize && index < array.length; i++) {
            // Process array[index] here
            ++index;
        }
        if (index < array.length) {
            // Schedule next async chunk
            setTimeout(doChunk, 1);
        }
    }    
    doChunk();    
}

processLargeArray(veryLargeArray);</code>

上記のコードを、forEach() メソッドと同様の、コールバックを受け入れる汎用関数に追加します。

<code class="javascript">function processLargeArrayAsync(array, fn, chunkSize, context) {
    context = context || window;
    chunkSize = chunkSize || 100;
    var index = 0;
    function doChunk() {
        for (var i = 0; i < chunkSize && index < array.length; i++) {
            // Callback called with args (value, index, array)
            fn.call(context, array[index], index, array);
            ++index;
        }
        if (index < array.length) {
            // Schedule next async chunk
            setTimeout(doChunk, 1);
        }
    }    
    doChunk();    
}

processLargeArrayAsync(veryLargeArray, myCallback, 100);</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) {
            // Callback called with args (value, index, array)
            fn.call(context, array[index], index, array);
            ++index;
        }
        if (index < array.length) {
            // Schedule next async chunk
            setTimeout(doChunk, 1);
        }
    }    
    doChunk();    
}

processLargeArrayAsync(veryLargeArray, myCallback);</code>

WebWorker ソリューション

ループ コードが DOM または他のブラウザー状態と対話しない場合は、Web ワーカーを活用して操作を実行できます。別のスレッドで。 Web ワーカーは独立して実行され、postMessage 経由で結果をメイン スレッドに送り返します。このアプローチにより、負荷の高い計算がバックグラウンドで実行されている間も、UI スレッドの応答性が維持されます。ただし、Web ワーカーで実行されるコードを別のスクリプト ファイルに移動する必要があることに注意してください。

以上が大規模な配列を処理するときに UI の応答性を確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。