Question

J'ai lu quelques-unes des questions connexes ( Modèle permettant d'encapsuler une fonction JavaScript asynchrone afin de la rendre synchrone > Assurez-vous que les événements asynchrones soient synchronisés en JavaScript et il peut y en avoir plus), mais je veux juste m'assurer d'épuiser toutes les possibilités.

Pourrait-il être possible de "convertir" un XmlHttpRequest asynchrone en un quasi-synchrone utilisant setInterval ou setTimeout?

L’idée étant qu’en cas de succès de la demande Ajax, une variable sera définie, laquelle servira de signal pour une boucle while (qui a appelé setInterval ou setTimeout et une fonction de rappel selon le cas) pour quitter. Ou suis-je fondamentalement en train de mal comprendre les capacités (ou les limites?) De setInterval et / ou setTimeout?

Était-ce utile?

La solution

C’est vrai, vous ne voulez pas utiliser setInterval et setTimeout comme vous l’avez décrit. Ce que vous voulez vraiment faire, c'est simplement vous familiariser avec les fonctions imbriquées, où vous pouvez écrire de manière plus ou moins synchrone.

Par exemple:

XHR.get(your_data, function()
   {
      //what you would have done "synchronously"
   });

Vous pouvez utiliser setInterval et / ou setTimeout (avec les appels à setTimeout à nouveau dans le corps de la fonction) pour "interroger". pour un code de succès, cette approche est nettement inférieure à la simple gestion du rappel au lieu de l'interrogation. Il introduit la latence, s’échappe avec le processeur et ne s’adapte pas à plusieurs requêtes XHR, pour ne nommer que quelques défauts.

XHR appellera votre fonction à la fin de son exécution. Cela n'a pas beaucoup de sens de lancer une fonction demandant "Avons-nous déjà terminé?" Avons-nous terminé? & Quot; pendant ce temps. D'un autre côté, si vous souhaitez BLOQUER un comportement périodique jusqu'à ce que la réponse apparaisse (une animation nécessitant l'exécution de ces données, par exemple), il est tout à fait acceptable d'entourer le code bloquant dans une instruction 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; });

Autres conseils

Si je comprends bien votre question, vous pouvez obtenir un effet similaire en utilisant le code suivant:

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);
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top