1

実行時間の長いロジック (longLoop) を setTimeout 関数でラップしましたが、実行時間の長い実行が終了するまで UI が応答しなくなります。他の UI ボタン​​をクリックすることはできません。以下の例を見て、何か問題があればお知らせください。

function longLoop () {
    var startLogTime, endLogTime;
    startLogTime = new Date().getTime();
    console.log("loop begin");
    for (var i = 0; i <= 500000000; i++) {
        var j = 10;
    }
    endLogTime = new Date().getTime();
    console.log("loop execution takes " + (endLogTime - startLogTime) + " milliseconds");
}

$(document).ready(function () {

    $("#btnButton").bind("click", function () {
        setTimeout(longLoop, 15);

    });

    $("#anotherButton").bind("click", function () {
        console.log("another operation clicked");
    });
});

<input type="button" id="btnButton" value="Start Long Operation" />
<input type ="button" id="anotherButton" value= "Another operation" />

ありがとう

4

3 に答える 3

6

「非同期」であってもsetTimeout、メイン イベント ループで呼び出しをディスパッチします。メイン イベント ループは、クリック、キーボード入力、および Web ページがディスパッチする可能性のあるすべてのイベントも受け取るため、長い操作によって UI がフリーズする瞬間を遅らせているだけです。

メイン イベント ループと並行して操作を実行する場合は、実際のスレッドを生成するWeb ワーカーを調べる必要があります (いくつかの重要な制約があります)。

于 2012-05-15T19:10:05.037 に答える
0

JavaScriptはマルチスレッド言語ではありません。setTimeoutを使用する場合でも、メイン スレッドで実行されます。操作を延期しているだけです。バックグラウンドで CPU を集中的に使用するタスクを実行するための新しい JavaScript API であるWeb-Workersを確認する必要があります。

于 2012-05-15T19:14:09.147 に答える
0

JavaScript はシングルスレッドであるため、実行中のメソッドは常に 1 つだけです。いったんlongLoop開始すると、他に何もできなくなります。新しいHTML5 Web ワーカーを使用すると、この制限を回避できます。

于 2012-05-15T19:12:44.363 に答える