サーバーに毎秒XMLHttpRequest
を送信しています。サーバーは新しいメッセージで応答します。毎秒XMLHttpRequest
を呼び出すには、SharedWorker
内でsetInterval()
関数を使用します。
しかし、毎秒リクエストを行っているので、setInterval()
が非同期かどうか知りたいのですが?
たとえば、1つのXMLHttpRequest
リクエストが「遅延のため」に完了するまでに3秒かかった場合、3つのリクエストが同時に処理されるか、最初のリクエストが完了するまでsetInterval()
は待機しますか1秒待ってから別のリクエストを送信しますか?
これが私のコードです
function checkQueue(url)
{
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", reqListener);
xhr.open('GET', url, true);
xhr.send();
}
function reqListener ()
{
var queue = JSON.parse(this.responseText);
notifyAllPorts(queue);
console.log(this.responseText);
}
setInterval(
function() {
checkQueue('/add-ons/icws/Push.php')
}
, 1000);
指摘したように、リクエストが完了するまで待機しません。約束の間隔を空ける方法は次のとおりです。
function checkQueue(url, cb) {
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", cb);
xhr.addEventListener("load", reqListener);
xhr.open('GET', url, true);
xhr.send();
}
function reqListener ()
{
var queue = JSON.parse(this.responseText);
notifyAllPorts(queue);
console.log(this.responseText);
}
var promise = Promise.resolve(true);
setInterval(function () {
promise = promise.then(function () {
return new Promise(function (resolve) {
checkQueue(yourUrlHere, resolve);
});
});
}, 1000);
1秒ごとに実行するリクエストを追加し続けますが、1秒を超えるとそれ自体が遅延します。
はい、問題が発生します。 setInterval
は、リクエストの状態に関係なく、時計仕掛けのように動作します。
すべてのリクエストの完了時にsetTimeout
を使用して1ヒットタイマーを開始した方がよいでしょう...
function checkQueue(url)
{
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", reqListener);
xhr.open('GET', url, true);
xhr.send();
}
function reqListener ()
{
var queue = JSON.parse(this.responseText);
notifyAllPorts(queue);
console.log(this.responseText);
setTimeout(
function() {
checkQueue('/add-ons/icws/Push.php')
}, 1000);
}
checkQueue('/add-ons/icws/Push.php')
setInterval
は、現在のコールスタックの実行が終了すると、コードをキューに入れて実行します。これは、いくつかの場合に役立ちます。
つまり、同期フローを中断するという点で非同期ですが、実際には同時に/別のスレッドで実行されることはありません。目標がバックグラウンド処理である場合は、ウェブワーカーをご覧ください。
したがって、コードが1000に設定されているため、サーバーがかかる時間に関係なく、毎秒要求します。
はい、setIntervalとsetTimeoutは非同期ですが、Webソケットのプッシュリクエストの読み取りが必要な場合は、プッシュを行わず、プルを行います。