Ich habe ein JavaScript-Widget, das Standarderweiterungspunkte bereitstellt. Eine davon ist die beforecreate
Funktion. Es sollte zurückkehren false
, um zu verhindern, dass ein Element erstellt wird.
Ich habe dieser Funktion mit jQuery einen Ajax-Aufruf 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);
});
}
Ich möchte jedoch verhindern, dass mein Widget das Element erstellt, daher sollte ich false
in der Mutterfunktion und nicht im Rückruf zurückkehren. Gibt es eine Möglichkeit, eine synchrone AJAX-Anforderung mit jQuery oder einer anderen In-Browser-API auszuführen?
javascript
jquery
ajax
asynchronous
Artem Tikhomirov
quelle
quelle
beforecreate
.Antworten:
In der jQuery-Dokumentation : Sie geben die asynchrone Option als false an, um eine synchrone Ajax-Anforderung abzurufen. Dann kann Ihr Rückruf einige Daten einstellen, bevor Ihre Mutterfunktion fortgesetzt wird.
So würde Ihr Code aussehen, wenn er wie vorgeschlagen geändert würde:
quelle
async: false
wird in jQuery> = 1.8 weiterhin unterstützt. Die Fähigkeit zur Verwendungasync: false
mit jqXHR ($.Deferred
) wurde nicht mehr empfohlen . Mit anderen Worten, man muss die neueren Rückrufoptionen für Erfolg / Fehler / Vollständigkeit anstelle der alten Methoden verwenden, zjqXHR.done()
.Sie können das Ajax-Setup von jQuery durch Aufrufen in den synchronen Modus versetzen
Führen Sie dann Ihre Ajax-Anrufe mit aus
jQuery.get( ... );
Dann einfach noch einmal einschalten
Ich denke, es funktioniert genauso wie von @Adam vorgeschlagen, aber es könnte für jemanden hilfreich sein, der seine
jQuery.get()
oderjQuery.post()
die ausgefeilterejQuery.ajax()
Syntax neu konfigurieren möchte .quelle
$.ajax()
". ;)Hervorragende Lösung! Als ich versuchte, es zu implementieren, bemerkte ich, dass ein Wert, der in der Erfolgsklausel zurückgegeben wurde, als undefiniert zurückgegeben wurde. Ich musste es in einer Variablen speichern und diese Variable zurückgeben. Dies ist die Methode, die ich mir ausgedacht habe:
quelle
getWhatever
. Sie haben also nichts zurückgegeben, dhundefined
von IhremgetWhatever
.Alle diese Antworten verfehlen den Punkt, dass ein Ajax-Aufruf mit async: false dazu führt, dass der Browser hängen bleibt, bis die Ajax-Anforderung abgeschlossen ist. Die Verwendung einer Flusssteuerungsbibliothek löst dieses Problem, ohne den Browser aufzulegen. Hier ist ein Beispiel mit Frame.js :
quelle
quelle
getURL
vsget
? Warum hängt man meinen Browser auf?" usw.Hinweis:
async: false
Aufgrund dieser Warnmeldungen sollten Sie Folgendes nicht verwenden :Chrome warnt sogar in der Konsole davor:
Dies könnte Ihre Seite beschädigen, wenn Sie so etwas tun, da es jeden Tag nicht mehr funktioniert.
Wenn Sie es auf eine Weise tun möchten, die sich immer noch so anfühlt, als wäre es synchron, aber immer noch nicht blockiert, sollten Sie async / await und wahrscheinlich auch Ajax verwenden, das auf Versprechungen wie der neuen Fetch- API basiert
Chrome bearbeiten funktioniert beim Deaktivieren der Synchronisierung von XHR beim Schließen von Seiten, wenn die Seite vom Benutzer weg navigiert oder geschlossen wird. Dies beinhaltet vor dem Entladen, Entladen, Pagehide und Sichtbarkeitsänderungen.
Wenn dies Ihr Anwendungsfall ist, sollten Sie sich stattdessen navigator.sendBeacon ansehen
Es ist auch möglich, dass die Seite die Synchronisierungsanforderung entweder mit http-Headern oder mit dem Attribut allow von iframe deaktiviert
quelle
await fetch(url)
Aufruf in einentry... catch
Block einschließen sollten , um asynchrone Fehler abzufangen.async
am Anfang verwendet wurde. Sie könnenfoo().catch(...)
es also auch tun , um es zu fangenbeforeunload
die Änderung jedoch nach negativen Rückmeldungen zurückgesetzt. Bugs.chromium.org/p/chromium/issues/detail?id=952452Denken Sie daran , dass , wenn Sie eine Cross-Domain Ajax - Aufruf zu tun (unter Verwendung JSONP ) - Sie nicht , kann es synchron tun, das
async
wird Flagge von jQuery ignoriert.Für JSONP-Aufrufe können Sie Folgendes verwenden:
quelle
Mit
async: false
dir bekommst du einen blockierten Browser. Für eine nicht blockierende synchrone Lösung können Sie Folgendes verwenden:ES6 / ECMAScript2015
Mit ES6 können Sie einen Generator und die Co-Bibliothek verwenden :
ES7
Mit ES7 können Sie einfach asyc await verwenden:
quelle
async function
,beforecreate: async function(....
um die selbst aufgerufene asynchrone Funktion zu erstellen und zu entfernenIch habe die Antwort von Carcione verwendet und sie so geändert, dass sie JSON verwendet.
Ich habe den Datentyp von 'JSON' hinzugefügt und den .responseText in responseJSON geändert .
Ich habe den Status auch mithilfe der statusText- Eigenschaft des zurückgegebenen Objekts abgerufen . Beachten Sie, dass dies der Status der Ajax-Antwort ist und nicht, ob der JSON gültig ist.
Das Back-End muss die Antwort in korrektem (wohlgeformtem) JSON zurückgeben, andernfalls ist das zurückgegebene Objekt undefiniert.
Bei der Beantwortung der ursprünglichen Frage sind zwei Aspekte zu berücksichtigen. Einer weist Ajax an, synchron zu arbeiten (indem async: false festgelegt wird ), und der andere gibt die Antwort über die return-Anweisung der aufrufenden Funktion zurück und nicht in eine Rückruffunktion.
Ich habe es auch mit POST versucht und es hat funktioniert.
Ich habe das GET in POST geändert und hinzugefügt Daten : postdata
Beachten Sie, dass der obige Code funktioniert nur in dem Fall , in dem Asynchron ist falsch . Wenn Sie async: true festlegen würden, wäre das zurückgegebene Objekt jqxhr zum Zeitpunkt der Rückkehr des AJAX-Aufrufs nicht gültig, erst später, wenn der asynchrone Aufruf beendet ist. Dies ist jedoch viel zu spät, um die Antwortvariable festzulegen.
quelle
Dies ist ein Beispiel:
quelle
async false
einer vielversprechenden Lösung ? Dies sperrt den Browser nur ohne jeglichen Nutzen.ajax
Anrufe kehren bereits zurück) und.then()
oderdone()
(wie bereits gezeigt). Das Sperren des Browsers ist eine sehr schlechte Benutzererfahrung. Wie gesagt,async: false
in diesem Beispiel zu haben, ist reine Zeitverschwendung.Erstens sollten wir verstehen, wann wir $ .ajax verwenden und wann wir $ .get / $. Post verwenden
Wenn wir eine niedrige Kontrolle über die Ajax-Anforderung benötigen, wie z. B. Anforderungen für den Anforderungsheader, Caching-Einstellungen, synchrone Einstellungen usw., sollten wir uns für $ .ajax entscheiden.
$ .get / $. post: Wenn wir keine einfache Kontrolle über die Ajax-Anforderung benötigen. Nur einfach die Daten an den Server senden. Es ist eine Abkürzung von
Daher können wir keine anderen Funktionen (Synchronisierung, Cache usw.) mit $ .get / $. post verwenden.
Daher sollten wir uns für eine Low-Level-Kontrolle (Synchronisierung, Cache usw.) Über Ajax-Anforderungen für $ .ajax entscheiden
quelle
Dies ist meine einfache Implementierung für ASYNC-Anforderungen mit jQuery. Ich hoffe das hilft jemandem.
quelle
Da der
XMLHttpReponse
synchrone Betrieb veraltet ist, habe ich die folgende Lösung gefunden, die umschließtXMLHttpRequest
. Dies ermöglicht geordnete AJAX-Abfragen, während sie von Natur aus asyknonisch sind, was für CSRF-Token zum einmaligen Gebrauch sehr nützlich ist.Es ist auch transparent, sodass Bibliotheken wie jQuery nahtlos funktionieren.
quelle
Da die ursprüngliche Frage zu war
jQuery.get
, ist es erwähnenswert , hier , dass (wie erwähnt hier ) ein könnte verwendenasync: false
in ein ,$.get()
aber idealerweise vermeiden es , da asynchroneXMLHTTPRequest
veraltet ist (und der Browser eine Warnung geben kann):quelle
einstellen
asyn:false
Ajax-Anfrage ein, um sie synchron zu machen.Hier ist das Codebeispiel:
Dies kann dazu führen, dass der Bildschirm nicht mehr reagiert.
quelle