8

ユビキタスプラグインを書いていますが、ajaxクエリの長​​い関数コールバックがGUIスレッドをブロックし、Firefoxがロックアップしています。

明らかな解決策は、ある種の遅延実行を使用することであるようです(つまり、このクエリ関数を実行する実行をイベントキューの最後に定期的に追加してから、他のコマンドを実行できるようにします。

私がこれを行うことを考えることができる唯一の方法は、タイムアウトがゼロのsettimeoutを使用することです...これは動作することが保証されているか、これを行うためのより良い方法があります。

4

2 に答える 2

8

setTimeoutブラウザーのコンテキストでこれを行う唯一の方法は、非常に短いタイムアウト (0偏執的であると感じている場合はほぼゼロ) で使用することです。それは非常にうまく機能し、非常に信頼性がありますが、十分な頻度譲歩するようにしてください。あなたがしているかもしれない他のこと]人間の言葉で)。

于 2009-09-20T21:48:07.153 に答える
3

同期リクエストはブラウザーをブロックするため、非同期リクエストを使用していることを確認してください (これにより、GUI がロックアップします)。

これが問題でない場合は、このタスク キューのようなものが必要だと思います。

var queue = [];

queue.push(someTaskFunction);
queue.push(anotherTaskFunction);
// ...

var runQueue = (function () {
    var len = queue.length, task = 0;
    for (; task < len; task++) {
        yield queue[task]();
    }
}());

runQueue.next()次のタスクを実行するために呼び出します。次のように、try..catch ステートメントでラップします。

try {
    runQueue.next();
} catch (e if (e instanceof StopIteration)) {}
于 2009-09-20T22:02:05.760 に答える