web-dev-qa-db-ja.com

setInterval()は非同期関数ですか?

サーバーに毎秒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);
9
Junior

指摘したように、リクエストが完了するまで待機しません。約束の間隔を空ける方法は次のとおりです。

 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秒を超えるとそれ自体が遅延します。

5
MinusFour

はい、問題が発生します。 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') 
3
spender

setIntervalは、現在のコールスタックの実行が終了すると、コードをキューに入れて実行します。これは、いくつかの場合に役立ちます。

つまり、同期フローを中断するという点で非同期ですが、実際には同時に/別のスレッドで実行されることはありません。目標がバックグラウンド処理である場合は、ウェブワーカーをご覧ください。

したがって、コードが1000に設定されているため、サーバーがかかる時間に関係なく、毎秒要求します。

1
sumeet kumar

はい、setIntervalとsetTimeoutは非同期ですが、Webソケットのプッシュリクエストの読み取りが必要な場合は、プッシュを行わず、プルを行います。

0
VEga