Frage

Ich habe einige der anderen Fragen ( Muster für eine asynchrone JavaScript-Funktion Einwickeln machen synchron & machen Sie async Veranstaltung synchron in JavaScript & es kann mehr) sein, aber ich möchte nur sicher sein, alle Möglichkeiten auszuschöpfen.

Könnte es möglich sein, zu „konvertieren“ ein asynchronen XmlHttpRequest in einem quasi-synchron man entweder setInterval oder setTimeout verwenden?

Die Idee, dass bei Erfolg der Anforderung Ajax ist, um eine Variable gesetzt werden, die das Signal für eine while-Schleife wird zu verlassen (das entweder setInterval oder SetTimeout und eine Callback-Funktion gegebenenfalls aufgerufen hat). Oder bin ich die Fähigkeiten grundsätzlich Missverständnis (oder Grenzen?) Von setInterval und / oder setTimeout?

War es hilfreich?

Lösung

Es ist wahr, Sie wollen nicht setInterval und setTimeout in der Art und Weise verwenden, die Sie beschrieben haben. Was Sie wirklich wollen, ist nur mit verschachtelten Funktionen komfortabel, wo Sie in einer mehr oder weniger synchron Art und Weise schreiben können.

Zum Beispiel:

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

Während Sie setInterval und / oder setTimeout (mit Aufrufen an SetTimeout wieder im Funktionskörper) auf „Umfrage“ für einen Erfolgscode verwenden können, ist dieser Ansatz dramatisch schlechter als nur den Rückruf in erster Linie Umgang statt Polling für es. Es führt Latenz, läuft weg mit der CPU und nicht über mehr XHR-Anforderungen skalieren, einige Mängel zu nennen.

XHR wird Ihre Funktion aufrufen, wenn es abgeschlossen ist, macht es wenig Sinn, eine Funktion zu laufen fragen: „Sind wir endlich fertig? Sind wir endlich fertig?“ inzwischen. Auf der anderen Seite, wenn es eine periodische Verhalten Sie, bis die Antwort auf Block werden wollen, kommt zurück (ein Stück Animation, die Bedürfnisse, die Daten zu laufen, zum Beispiel) es völlig akzeptabel ist, den Sperrcode in einer if-Anweisung zu umgeben:

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

Andere Tipps

Wenn ich Ihre Frage richtig hinzubekommen, können Sie einen ähnlichen Effekt mit dem folgenden Code erreichen könnten:

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);
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top