私はJavascriptルーチン(約400の複雑なもの)によって初期化されなければならない多くのウィジェットを使用する特定のページを持っています。これには時間がかかります(遅いマシンでは20秒もかかる)。今では、ページの代わりに進捗インジケータ(パーセントラベル付きの単純なテキストフィールド)を表示できると思っていましたが、私はそれを継続的に更新していても、進行中のタスクはすべてをブロックし、重いjavascriptタスクが完了するまで、すべてがフリーズしたままです。私は(...とFirefoxは、スクリプトが完了する時間がかかりすぎていることを述べている)も、次のような実験を行って、が、同様にフリーズ:Javascriptで長いタスクを監視する
function a(){
for (var i = 0; i < 5000000000000000; i++){
abb = i;
}
}
var abb;
function c(){
var ef = document.getElementById("pip");
ef.innerHTML = abb;
}
function b(){
setInterval(c, 50);
setTimeout(a, 1000);
}
私に来る唯一の解決策は、長い仕事を打破することです断片を入れてラベルを更新する....しかし、別の解決策があるかどうか疑問に思っていた!神、JSスレッドをできるだけ早く必要があります... :)
アイデア?
+1を「ピップ」とdiv要素を持っているBを呼び出すために持っていると仮定です!他のすべてが失敗したときに私はそれについて考える。 – ATorras
あなたの解決策は残念ながらうまくいかない。その理由は、長い仕事関数が返されるまで、他の関数を呼び出すとしても、何も更新されません(少なくともFFで)。唯一の方法は、グローバル変数を保持し、次のようにすることです: - 1から20までのことを行い、関数を使ってsetTimeout(1msのようにプリエンプションを持つ)を更新してから、 を返します。コールバック時に、 21〜40、setTimeoutなど... これは、この作業を正しく行うための唯一の方法だと思います。つまり、タイムシェアリングをエミュレートすることです。 – gotch4
...まさに私が書いた解決策です。 – kdgregory