jQuery: Ausführen synchroner AJAX-Anforderungen

187

Ich habe in der Vergangenheit einige jQuery gemacht, aber ich bin völlig festgefahren. Ich kenne die Vor- und Nachteile der Verwendung synchroner Ajax-Aufrufe, aber hier wird es erforderlich sein.

Die Remote-Seite wird geladen (mit Firebug gesteuert), es wird jedoch keine Rückgabe angezeigt.

Was sollte ich anders machen, damit meine Funktion ordnungsgemäß zurückkehrt?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}
Industriell
quelle
Ihr Code sieht gut aus. Was bringt es zurück? Gibt es irgendwelche js Fehler?
ShankarSangoli
11
Ich finde es ziemlich ironisch - Sie fragen, wie die Operation "Asynchrones JavaScript & XML" synchron ausgeführt werden soll. Was Sie wirklich brauchen, ist eine "SJAX".
VitalyB
3
Hinweis: Die Spezifikation hat begonnen, synchrone AJAX-Anforderungen zu verwerfen.
Léo Lam
2
Es scheint, dass die Aussage "[synchron] wird erforderlich sein" auf ein Unverständnis der JavaScript-Engines hinweist, also auf eine schlecht strukturierte App. Ich würde gerne verstehen, ob es Fälle gibt, in denen eine Synchronisierung wirklich erforderlich ist.
Uhr
15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.Oder ein sehr gutes Verständnis: Wenn Sie einen AJAX-Anruf tätigen möchten, ist die onbeforeunloadVerwendung einer synchronen Anforderung die empfohlene Methode (da das Browserfenster nicht mehr angezeigt wird, bevor die Anforderung anderweitig zurückgegeben wird). In irgendeiner Weise sagt er klar: "Ich weiß über die Vor- und Nachteile der Verwendung synchroner Ajax-Anrufe Bescheid" ... Vielleicht glauben Sie ihm einfach?
Stijn de Witt

Antworten:

297

Wenn Sie eine synchrone Anfrage stellen, sollte dies so sein

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

Beispiel - http://api.jquery.com/jQuery.ajax/#example-3

BITTE BEACHTEN SIE: Das Setzen der asynchronen Eigenschaft auf false ist veraltet und wird gerade entfernt ( Link ). Viele Browser, einschließlich Firefox und Chrome, haben bereits begonnen, eine Warnung in der Konsole zu drucken, wenn Sie Folgendes verwenden:

Chrom:

Die synchrone XMLHttpRequest im Hauptthread ist aufgrund ihrer nachteiligen Auswirkungen auf die Benutzererfahrung veraltet. Weitere Hilfe finden Sie unter https://xhr.spec.whatwg.org/ .

Feuerfuchs:

Die synchrone XMLHttpRequest im Hauptthread ist aufgrund ihrer nachteiligen Auswirkungen auf die Benutzererfahrung veraltet. Weitere Hilfe unter http://xhr.spec.whatwg.org/

Dogbert
quelle
16
Beachten Sie, dass responseTextimmer eine Zeichenfolge zurückgegeben wird. Wenn Sie JSON erwarten, schließen Sie $.ajaxmit JSON.parse.
usandfriends
6
Hinweis: xhr.spec.whatwg.org/#the-open()-method Synchrounous Anfragen sind veraltet ...
Teynon
5
@ Tom Und so waren die <i>und <b>Tags. Meine Empfehlung: Verwenden Sie diese Funktionen weiterhin, damit sie nicht verschwinden.
Stijn de Witt
1
Da dies den Browser sperrt, ist es sinnvoll, den Optionen eine Zeitüberschreitung von etwa 5000 hinzuzufügen.
Commonpike
1
@usandfriends Für das Analysieren von Strings zum Objekt ist es sicherer, jQuery.parseJSON anstelle von JSON.parse stackoverflow.com/questions/10362277/… zu verwenden
AntonE
33

Sie verwenden die Ajax-Funktion falsch. Da es synchron ist, werden die Daten wie folgt inline zurückgegeben:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;
Jake
quelle
17

Wie weit ist diese URL entfernt? ist es aus der gleichen Domain? Der Code sieht in Ordnung aus

Versuche dies

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;
Das Gehirn
quelle
Ja! Gleiche Domain und alles. remote_urlist richtig definiert und der AJAX-Aufruf wird wie erwähnt richtig ausgeführt (mit Firebug gesteuert). Nur keine Rückkehr!
Industrial
3
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}
user3116547
quelle
7
Bitte geben Sie eine Erklärung an, warum dies dem OP helfen wird.
Krillgar
Es wird empfohlen, ein JSON-Objekt von der Serverseite zurückzugeben. Es gibt Ihnen mehr Kontrolle. Sie müssen jedoch dataType: "json" zu Ihren obigen $ .ajax-Parametern hinzufügen.
JJWDesign
Was bedeutet das: "Es gibt Ihnen mehr Kontrolle"?
Grantwparks
3
Nicht verwandt, aber Sie können: result.valid zurückgeben; // Dies ist bereits ein Boolescher
Wert