Ich habe eine serverseitige Funktion, für die eine Anmeldung erforderlich ist. Wenn der Benutzer angemeldet ist, gibt die Funktion bei Erfolg 1 zurück. Wenn nicht, gibt die Funktion die Anmeldeseite zurück.
Ich möchte die Funktion mit Ajax und jQuery aufrufen. Ich sende die Anfrage mit einem normalen Link, auf den eine Klickfunktion angewendet wird. Wenn der Benutzer nicht angemeldet ist oder die Funktion fehlschlägt, möchte ich, dass der Ajax-Aufruf true zurückgibt, damit die href ausgelöst wird.
Wenn ich jedoch den folgenden Code verwende, wird die Funktion beendet, bevor der Ajax-Aufruf abgeschlossen ist.
Wie kann ich den Benutzer ordnungsgemäß auf die Anmeldeseite umleiten?
$(".my_link").click(
function(){
$.ajax({
url: $(this).attr('href'),
type: 'GET',
cache: false,
timeout: 30000,
error: function(){
return true;
},
success: function(msg){
if (parseFloat(msg)){
return false;
} else {
return true;
}
}
});
});
Antworten:
Wenn die
$.ajax()
Funktion nicht sofort zurückkehren soll, setzen Sie dieasync
Option auffalse
:Ich möchte jedoch darauf hinweisen, dass dies dem Punkt von AJAX widerspricht. Außerdem sollten Sie die Antwort in den Funktionen
error
und verarbeitensuccess
. Diese Funktionen werden nur aufgerufen, wenn die Antwort vom Server empfangen wird.quelle
async: false
. Die Ereignisschleife des Browsers bleibt hängen, während auf unzuverlässige Netzwerk-E / A gewartet wird. Es gibt immer einen besseren Weg. In diesem Fall kann das Ziel des Links die Benutzersitzung und 302 die Anmeldeseite überprüfen.async: false
kann sehr nützlich sein.async
mit Wertfalse
ist in den meisten Anwendungsfällen des Browsers veraltet. In neueren Versionen von Browsern kann es zu Ausnahmen kommen. Siehe xhr.spec.whatwg.org/#sync-warning (gilt fürasync
Parameter der xhr-open
Methode, die jQuery verwendet).Ich bin nicht mit ,
$.ajax
aber die$.post
und$.get
Funktionen, so dass , wenn ich auf die Antwort warten müssen, verwende ich diese:quelle
Das zugrunde liegende XMLHttpRequest-Objekt (das von jQuery zum Erstellen der Anforderung verwendet wird) unterstützt die asynchrone Eigenschaft. Setzen Sie es auf false . Mögen
quelle
Anstatt async auf false zu setzen, was normalerweise ein schlechtes Design ist, sollten Sie die Benutzeroberfläche blockieren, während der Vorgang ansteht.
Dies kann mit jQuery-Versprechungen wie folgt erreicht werden:
Damit können Sie jetzt tun:
Die Benutzeroberfläche wird blockiert, bis der Befehl ajax zurückgegeben wird
siehe jsfiddle
quelle
Ich denke, es wäre einfacher, wenn Sie Ihre
success
Funktion so codieren , dass die entsprechende Seite geladen wird, anstatttrue
oder zurückzugebenfalse
.Anstatt zurückzukehren
true
, könnten Sie beispielsweise Folgendes tun:Auf diese Weise wird die Seite beim Aufrufen der Erfolgsfunktion umgeleitet.
quelle
In modernen JS können Sie einfach
async
/ verwendenawait
, wie:Rufen Sie es dann in einer
async
Funktion wie:quelle
async
Funktion auf".Da ich es hier nicht erwähnt sehe, dachte ich, ich würde auch darauf hinweisen, dass die jQuery when- Anweisung für diesen Zweck sehr nützlich sein kann.
Ihr Beispiel sieht so aus:
Der "dann" -Teil wird erst ausgeführt, wenn der "wann" -Teil beendet ist.
quelle
Es sollte warten, bis die Anfrage abgeschlossen ist. Danach werde ich get request text zurückgeben, von wo aus die Funktion aufgerufen wird.
quelle