1322 Stimmen

Wie kann ich jQuery dazu bringen, eine synchrone und nicht eine asynchrone Ajax-Anfrage durchzuführen?

Ich habe ein JavaScript-Widget, das Standard-Erweiterungspunkte bietet. Einer von ihnen ist die beforecreate Funktion. Sie sollte zurückgeben false um zu verhindern, dass ein Artikel erstellt wird.

Ich habe einen Ajax-Aufruf in dieser Funktion mit jQuery hinzugefügt:

beforecreate: function (node, targetNode, type, to) {
  jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),

  function (result) {
    if (result.isOk == false) 
        alert(result.message);
  });
}

Aber ich möchte verhindern, dass mein Widget das Element erstellt, also sollte ich zurückgeben false in der Mutterfunktion, nicht im Rückruf. Gibt es eine Möglichkeit, eine synchrone AJAX-Anfrage mit jQuery oder eine andere in-Browser-API durchzuführen?

36 Stimmen

Der richtige Weg, um das zu lösen wäre, um Ihre Widget-Erweiterung Punkt Verwendung Versprechen neu zu schreiben. Auf diese Weise können Sie leicht eine asynchrone Aktion (wie eine Ajax-Anfrage) als beforecreate .

3 Stimmen

Ich schlage die Sajak-Funktion vor. Haben wir einen Buchstaben T? Ja, Vanna, gib mir 3 T's.

2 Stimmen

@Kos ist genau richtig. Sync XHR ist hier nicht erforderlich

1249voto

Adam Bellaire Punkte 103525

Desde el jQuery-Dokumentation : Sie geben die asynchrone Option zu sein falsch um eine synchrone Ajax-Anfrage zu erhalten. Dann kann Ihr Callback einige Daten setzen, bevor Ihre Mutterfunktion fortfährt.

So würde Ihr Code aussehen, wenn Sie ihn wie vorgeschlagen ändern:

beforecreate: function (node, targetNode, type, to) {
    jQuery.ajax({
        url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
        success: function (result) {
            if (result.isOk == false) alert(result.message);
        },
        async: false
    });
}

105 Stimmen

Genau, es ist unmöglich, get(), post(), load() für synchrone Aufrufe zu verwenden. Nur ajax() hat den Parameter "async", der auf "false" gesetzt werden kann.

42 Stimmen

@SLA80 Nö. Seit jQuery 1.1: stackoverflow.com/questions/6849686/

3 Stimmen

Beachten Sie, dass die Verwendung von async: false es Abgelehnt . Wenn Sie es verwenden, wird in der Konsole die folgende Meldung angezeigt: "Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. Für mehr Hilfe xhr.spec.whatwg.org "

276voto

Sydwell Punkte 4780

Sie können das Ajax-Setup von jQuery in den synchronen Modus versetzen, indem Sie

jQuery.ajaxSetup({async:false});

Und dann führen Sie Ihre Ajax-Aufrufe mit jQuery.get( ... );

Dann schalten Sie es einfach wieder ein

jQuery.ajaxSetup({async:true});

Ich schätze, es funktioniert genauso, wie von @Adam vorgeschlagen, aber es könnte für jemanden hilfreich sein, der seine Daten neu konfigurieren möchte. jQuery.get() o jQuery.post() bis hin zu den aufwändigeren jQuery.ajax() Syntax.

147voto

James in Indy Punkte 2714

Ausgezeichnete Lösung! Als ich versuchte, sie zu implementieren, bemerkte ich, dass, wenn ich einen Wert in der Erfolgsklausel zurückgab, dieser als undefiniert zurückkam. Ich musste ihn in einer Variablen speichern und diese Variable zurückgeben. Dies ist die Methode, die ich mir ausgedacht habe:

function getWhatever() {
  // strUrl is whatever URL you need to call
  var strUrl = "", strReturn = "";

  jQuery.ajax({
    url: strUrl,
    success: function(html) {
      strReturn = html;
    },
    async:false
  });

  return strReturn;
}

66 Stimmen

Dies ist ein synchroner Aufruf (async:false).

93voto

BishopZ Punkte 6049

Alle diese Antworten gehen an der Tatsache vorbei, dass ein Ajax-Aufruf mit async:false dazu führt, dass der Browser hängen bleibt, bis die Ajax-Anfrage abgeschlossen ist. Die Verwendung einer Flusskontrollbibliothek löst dieses Problem, ohne dass der Browser hängen bleibt. Hier ist ein Beispiel mit Frame.js :

beforecreate: function(node,targetNode,type,to) {

    Frame(function(next)){

        jQuery.get('http://example.com/catalog/create/', next);
    });

    Frame(function(next, response)){

        alert(response);
        next();
    });

    Frame.init();
}

55voto

Carcione Punkte 713
function getURL(url){
    return $.ajax({
        type: "GET",
        url: url,
        cache: false,
        async: false
    }).responseText;
}

//example use
var msg=getURL("message.php");
alert(msg);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X