同期XmlHttpRequestのシミュレーション
-
05-07-2019 - |
質問
その他の関連する質問をいくつか読みました(非同期JavaScript関数をラップして同期させるパターン& JavaScriptで非同期イベントを同期にする&があります)が、すべての可能性を使い果たすようにしたいだけです。
"変換&quot ;; setIntervalまたはsetTimeoutのいずれかを使用して、非同期XmlHttpRequestを準同期のものに変換しますか?
Ajaxリクエストの成功時に変数が設定され、終了ループ(setIntervalまたはsetTimeoutのいずれか、および必要に応じてコールバック関数を呼び出した)のシグナルとなるという考え方です。または、私は基本的にsetIntervalおよび/またはsetTimeoutの機能(または制限)を誤解していますか?
解決
それは本当です。あなたが説明した方法で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; });
他のヒント
質問が正しければ、次のコードを使用して同様の効果を得ることができます。
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);
});