Javascriptでこのようにループすることはできません。 Javascriptはイベント駆動型のシステムです。このようにループすると、他のイベントは処理されません。したがって、最初のAjax呼び出しでさえ処理されません。事実、クライアントが何百万ものAjaxコールを一斉に呼び出そうとすると、リソースを使い切ってJSエンジンを地面に追いやるだけです。
代わりに、あなたは非同期Ajaxの結果を使用して、再びそれを呼び出すかどうかの結果から判断することができます。
function poll() {
$.ajax(...).then(function(data) {
if (!data.xxxx) {
// call it again after some short delay
setTimeout(poll, 1000);
} else {
// got the result we wanted, process it
}
})
}
// start the polling
poll();
あなたは全部が約束を返すようにしたい場合は、あなたがこれを行うことができます:
function delay(t) {
return new $.Deferred(function(def) {
setTimeout(def.resolve, t);
}).promise();
}
function poll() {
return $.ajax(...).then(function(data) {
if (!data.xxxx) {
// call it again after some short delay
return delay(1000).then(poll);
} else {
// got the result we wanted, process it
return someValue;
}
})
}
// start the polling
poll().then(function(result) {
// process result here
});
PSできるだけ速くサーバーを常にポーリングするのは正しいことではありません。何人かのユーザーしかいない場合でもうまくいくかもしれませんが、多くのユーザーがいるとすぐに、空のポーリング要求でサーバーを圧倒します。ほとんどの場合、クライアントには何も返されません。これは負荷を処理するための悪夢です。ポーリングしていないアーキテクチャを見つける方が良いですが、ポーリングする場合は、できるだけ早くではなく、ある種のタイマーを使用して将来の時間にポーリングしてください。
P.P.S.サーバー上で値を変更するのを待っているのであれば、おそらくwebSocket接続を使用する必要があります。これにより、クライアントはサーバーとの接続を確立し、接続は維持された後、将来、サーバーは単にクライアントにメッセージを送信することができます。クライアントはまったくポーリングする必要はありません。これは、サーバーインフラストラクチャ上で大幅に効率化され、よりタイムリーな結果を提供できます。
この投票で延期を使用したいと思いますが、それは可能ですか?私がpoll()を行うことができるようにdone(...)もちろん、data.xxx? – Wesley
@ウェズリー - あなたが望むものは分かりません。すでに約束を使っている私の答えに '$ .ajax(...)。then()'があります。私は、jQuery固有の '.done() 'ではなく、ES6標準の' .then() 'を使用することを好みます。ポーリングが完了したときにすべてが約束を返すようにしたい場合は、それを行うことができます(それはあなたがあなたの質問で尋ねたものではありません)。 – jfriend00
@Wesley - もう1つのオプションを追加しました。 – jfriend00