1

他の関連する質問をいくつか読みました (非同期 JavaScript 関数をラップして同期させるためのパターン& JavaScript で非同期イベントを同期させる &もっとあるかもしれません) が、すべての可能性を確実に使い果たしたいだけです。

setInterval または setTimeout を使用して、非同期の XmlHttpRequest を準同期の XmlHttpRequest に「変換」することは可能でしょうか?

Ajax リクエストが成功すると変数が設定され、これが while ループ (setInterval または setTimeout のいずれか、および必要に応じてコールバック関数を呼び出した) が終了するためのシグナルとなります。または、setInterval および/または setTimeout の機能 (または制限) を根本的に誤解していますか?

4

2 に答える 2

2

確かに、説明した方法で setInterval と setTimeout を使用したくないでしょう。あなたが本当にやりたいことは、多かれ少なかれ同期的な方法で書くことができるネストされた関数に慣れることです。

例えば:

XHR.get(your_data, function()
   {
      //what you would have done "synchronously"
   });

setInterval および/または setTimeout (関数本体で再度 setTimeout を呼び出す) を使用して成功コードを「ポーリング」することはできますが、そのアプローチは、コールバックをポーリングする代わりに最初にコールバックを処理するよりも劇的に劣ります。いくつかの欠点を挙げると、遅延が発生し、CPU で暴走し、複数の XHR リクエストにまたがってスケーリングされません。

XHR は完了時に関数を呼び出します。関数を実行して「まだ完了していますか?」と尋ねるのはほとんど意味がありません。その間。一方、応答が返されるまでブロックしたい周期的な動作がある場合 (たとえば、そのデータを実行する必要があるアニメーションの一部)、ブロック コードを if ステートメントで囲むことはまったく問題ありません。

var tick = window.setTimeout(tock, 20);
var tock = function()
{
   if (response_done)
   {
      // dependent code
   }
   tick = window.setTimeout(tock, 20);
}
XHR.get(your_data, function() { /*Handle response*/ response_done = true; });
于 2010-02-08T20:12:00.267 に答える
0

質問が正しければ、次のコードを使用して同様の効果を得ることができます。

var computationInterval =
    window.setInterval(function() {
        // do a computation cycle, as if you're in the body of a while loop
    }, 100);

$.get('http://example.com/areWeThereYet', function() {
    // break the intervals (the pseudo-cycle)
    window.clearInterval(computationInterval);
});
于 2009-11-27T18:12:51.477 に答える