web-dev-qa-db-fra.com

SetInterval () est-il une fonction asynchrone?

Je fais une XMLHttpRequest chaque seconde à un serveur, le serveur va répondre avec de nouveaux messages. Pour appeler la XMLHttpRequest à chaque seconde, j'utilise la fonction setInterval() à l'intérieur d'une SharedWorker.

Cependant, comme je fais une demande toutes les secondes, j'aimerais savoir si setInterval() est asynchrone ou non?

Par exemple, si une demande XMLHttpRequest prend 3 secondes pour terminer "en raison d'un retard", puis-je recevoir 3 demandes en même temps ou est-ce que setInterval() attendra la fin de la première demande avant d'attendre 1 seconde et d'envoyer une autre demande?

Voici mon code

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);
7
Mike A

Comme indiqué, il n'attendra pas que la demande soit terminée. Voici un moyen d'intervalle une promesse:

 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);

Il continuera d'ajouter des demandes à faire toutes les secondes, mais se retardera s'il dépasse 1 seconde. 

3
MinusFour

Oui, vous aurez des ennuis. setInterval fonctionnera comme sur des roulettes, quel que soit l'état de vos demandes. 

Vous feriez mieux de démarrer une minuterie en une frappe en utilisant setTimeout à la fin de chaque demande ... donc:

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 met simplement le code en file d'attente à exécuter une fois que la pile d'appels en cours est terminée. Cela peut être utile pour certaines choses.

Donc oui, il est asynchrone dans le sens où il interrompt le flux synchrone, mais ne s'exécutera pas en même temps/sur un thread séparé. Si votre objectif est le traitement en arrière-plan, consultez les travailleurs Web. 

Ainsi, quel que soit le temps mis par le serveur, il demandera chaque seconde selon que votre code est défini sur 1000

1
sumeet kumar

oui, setInterval et setTimeout sont asynchrones, mais vous ne faites pas de Push, vous faites un pull, si vous voulez une demande de Push lire sur des sockets web

0
VEga