0

JSコードの実行に時間がかかるため、ブラウザがロックされます。

私はそれをで分割することができましたsetTimeout、それはうまくいくでしょう。しかし、その後、コードを再構築する必要があります。良いライブラリがあれば、コードを再構築しなくても(多すぎて)可能になるはずです。

それで、それを提供するjs libはありますか?疑似コルーチンのようなものですか?

互換性の理由から、Webワーカーは使いたくありません。

編集:私はlibが何をするか尋ねられました。さて、このコードを考えてみましょう。

dosomething();
for(var x=0; x<w; x++) {
    for(var y=0; y<h; y++) {
        dosomething2();
    }
}
dosomething3();

setIntervalで分割できるので、ブラウザに制御を戻す前に、たとえば外側のループを10回だけ繰り返します。しかし、それにはコードを何度も再構築する必要があります。libは、私がそれをより簡単に行えるようにするために、いくつかのトリックを行うことができます。たとえば、C#langでは、ジェネレーターとasyncキーワードが(実際には2つの方法で)可能です。

4

1 に答える 1

2

サーバー側の言語を使用して数値計算を行う場合はどうですか? 必要なデータを送信すると、非同期で処理され、準備ができたらクライアントに返されます。

これは、リソースを大量に消費する計算をクライアントのコンピューティング パワーに依存するよりも優れた方法です。

JS ループを非同期にする必要がある場合は、次のようにします。

dosomething();

function iterate(count) {
    count--;
    if (count > 0) {
        dosomething2();
        setTimeout(
        function() {
            iterate(count);
        }, 10); // iterates every 10 ms
    }
}
iterate(10); //runs the loop 10 times, asynchronously

dosomething3();

バックグラウンドで繰り返しが発生している間、dosomethingdosomething3はほぼ連続して発生することに注意してください。dosomething2個体ごとdosomething2にインターフェースがロックアップしますが、連続して発生するわけではないので問題ありません。

また、現在、反復を 10 ミリ秒ごとに 1 に調整していますが、これを 0 に設定しても同様の結果が得られることに注意してください。

ここにデモンストレーションがあります:http://jsfiddle.net/mW6vz/

于 2012-12-02T15:25:40.230 に答える