Ist es möglich, async: false auf $ .getJSON aufzurufen?


105

Ist es möglich, async: falsebeim Aufrufen $.getJSON()festzulegen, dass der Anruf blockiert und nicht asynchron ist?


1
Geben

1
@Milney - Sehr seltsam ... Offiziell es ist veraltet; eigentlich ist es nicht . Wenn es wirklich veraltet wäre, wäre die Möglichkeit, entweder einen AJAX-Synchronisierungsaufruf oder einen $ ajax.setup-Schalter durchzuführen, in jQuery 3 weggelassen worden. Tatsächlich ist ein Synchronisierungsaufruf gelegentlich sehr nützlich, beispielsweise beim Initialisieren von Globals mit JSON-Daten, wenn Sie andere globale Daten haben, die auf dem ersten Stapel basieren. (Das Packen des gesamten Initialisierungsprozesses in die Rückruffunktion kann unter bestimmten Umständen sehr schwierig sein.)
Brice Coustillas

Ich denke, synchrone XHR-Anforderungen oder Restrukturierungscode würden diesen Fall beantworten.
Chetabahana

Antworten:


154

Sie müssen den Anruf $.ajax()synchron wie folgt tätigen :

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    //stuff
    //...
  }
});

Dies würde derzeit $.getJSON()wie folgt übereinstimmen :

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});

23
Ich habe festgestellt, dass die Convenience-Methode $ .getJSON () fast nie nützlich ist und immer $ .ajax () verwendet.
Jacob Marble

Kann ich dies auch für POST-Anrufe verwenden?
Hitesh

@hitesh Ja, Sie würden auch eine type: 'POST'Option hinzufügen , um daraus einen Beitrag zu machen - obwohl Sie ihn nur verwenden möchten, async: falsewenn Sie es wirklich brauchen - wird die Benutzeroberfläche gesperrt.
Nick Craver

1
Was soll die 'myData' in diesem Fall sein? Wenn ich Daten lösche: myData funktioniert vollständig. Ziemlich neu bei Ajax-Anrufen!
nclsvh

2
Ich bin gerade auf das folgende neue Problem gestoßen: "Synchrones XMLHttpRequest außerhalb von Workern wird gerade von der Webplattform entfernt, da es sich nachteilig auf die Erfahrung des Endbenutzers auswirkt. (Dies ist ein langer Prozess, der viele Jahre dauert.) Entwickler müssen Geben Sie für das asynchrone Argument nicht false ein, wenn das globale Objekt des Eintragseinstellungsobjekts ein Fensterobjekt ist. Benutzeragenten werden dringend aufgefordert, vor einer solchen Verwendung in Entwicklertools zu warnen, und können versuchen, eine InvalidAccessError-Ausnahme auszulösen, wenn sie auftritt. "
Ken Sharp

46

Beide Antworten sind falsch. Sie können. Sie müssen anrufen

$.ajaxSetup({
async: false
});

vor Ihrem json ajax anruf. Und Sie können es auf true setzen, nachdem der Anruf erneut ausgeführt wurde (wenn auf der Seite andere Verwendungen von Ajax vorhanden sind, wenn Sie möchten, dass sie asynchron sind).


1
Ich habe gerade diesen Teil der Dokumente noch einmal gelesen. Hier ist der Teil, der über ajaxSetup spricht: api.jquery.com/jQuery.ajaxSetup Und hier sind Optionen: api.jquery.com/jQuery.ajax Es heißt eindeutig: "async Standard: true Standardmäßig werden alle Anforderungen asynchron gesendet ( Dies ist standardmäßig auf true gesetzt. Wenn Sie synchrone Anforderungen benötigen, setzen Sie diese Option auf false. Domänenübergreifende Anforderungen und Datentyp: "jsonp" -Anforderungen unterstützen keinen synchronen Betrieb. "JSONP ist nicht JSON, daher denke ich immer noch, dass ich es bin von Anfang an. Ich werde später ein Beispiel schreiben, wenn ich etwas Zeit habe.
Velja

7
Dies ist ein später Kommentar, aber ... welche "beiden" Antworten sind falsch? Ich sehe die Antwort von @Nick Craver sowohl akzeptabel als auch nicht "durcheinander" mit den globalen AJAX-Einstellungen (sollten andere Anfragen gleichzeitig
ausgelöst werden

1
Es funktioniert, aber dies würde das auf alle Ajax-Anfragen anwenden, die Sie auf der Seite stellen. Also werde ich abstimmen, da ich es nicht empfehlen würde
GabrielBB

3
Dies ist eine Antwort von sehr geringer Qualität
Brian Webster

1
-1: Das Synchronisieren von Dingen kann kostspielig sein. Sie sollten dies auf jeden Fall pro Anruf tun, es sei denn, Ihr Projekt erfordert dies jedes Mal. Ihre Antwort zeigt , dass Sie global konfigurieren , dass alle Anrufe $.ajax(und spätere Stenografie Wrapper dh $.getJSON, $.getetc.) synchron sein. Darüber hinaus wird in der Dokumentation sogar empfohlen, dies nicht zu verwenden: "Beschreibung: Legen Sie Standardwerte für zukünftige Ajax-Anforderungen fest. Die Verwendung wird nicht empfohlen."
Carrie Kendall

18

Ich denke ihr beide habt recht. Die spätere Antwort funktioniert einwandfrei, entspricht jedoch dem Festlegen einer globalen Option, sodass Sie Folgendes tun müssen:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

In meinem Fall hat Jay D recht. Ich muss dies vor dem Anruf hinzufügen.

$.ajaxSetup({
    async: false
});

In meinem vorherigen Code habe ich Folgendes:

var jsonData= (function() {
    var result;
    $.ajax({
        type:'GET',
        url:'data.txt',
        dataType:'json',
        async:false,
        success:function(data){
            result = data;
        }
    });
    return result;
})();
alert(JSON.stringify(jsonData));

Es funktioniert zu finden. Dann wechsle ich zu

var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

Die Warnung ist undefiniert.

Wenn ich diese drei Zeilen hinzufüge, werden die Daten in der Warnung erneut angezeigt.

$.ajaxSetup({
    async: false
});
var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

1

Wenn Sie nur awaitVerschachtelungscode vermeiden müssen:

let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
    json = data;
    done();
}));

0

Ich glaube nicht, dass Sie diese Option dort einstellen können. Sie müssen jQuery.ajax () mit den entsprechenden Parametern verwenden (im Grunde verpackt getJSON diesen Aufruf auch in eine einfachere API).


0

Rollen Sie Ihre eigenen zB

function syncJSON(i_url, callback) {
  $.ajax({
    type: "POST",
    async: false,
    url: i_url,
    contentType: "application/json",
    dataType: "json",
    success: function (msg) { callback(msg) },
    error: function (msg) { alert('error : ' + msg.d); }
  });
}

syncJSON("/pathToYourResouce", function (msg) {
   console.log(msg);
})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.