Mam funkcję po stronie serwera, która wymaga logowania. Jeśli użytkownik jest zalogowany, funkcja zwróci 1 po pomyślnym zakończeniu. Jeśli nie, funkcja zwróci stronę logowania.
Chcę wywołać funkcję za pomocą Ajax i jQuery. To, co robię, to przesłanie żądania zwykłym linkiem z zastosowaną funkcją kliknięcia. Jeśli użytkownik nie jest zalogowany lub funkcja nie powiedzie się, chcę, aby wywołanie Ajax zwróciło wartość true, aby uruchomił się href.
Jednak gdy użyję następującego kodu, funkcja kończy działanie przed wykonaniem wywołania Ajax.
Jak mogę z wdziękiem przekierować użytkownika na stronę logowania?
$(".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;
}
}
});
});
Odpowiedzi:
Jeśli nie chcesz, aby
$.ajax()
funkcja natychmiast wracała, ustawasync
opcję nafalse
:Chciałbym jednak zauważyć, że byłoby to sprzeczne z punktem AJAX. Powinieneś także obsługiwać odpowiedzi w funkcjach
error
isuccess
. Funkcje te będą wywoływane dopiero po otrzymaniu odpowiedzi z serwera.źródło
async: false
. Pętla zdarzeń przeglądarki zawiesi się podczas oczekiwania na niewiarygodne sieciowe operacje we / wy. Zawsze jest lepszy sposób. W takim przypadku cel łącza może zweryfikować sesję użytkownika i 302 do strony logowania.async: false
może być bardzo przydatny.async
wartośćfalse
jest przestarzała w większości przypadków użycia przeglądarki. Może powodować wyjątki w nowszych wersjach przeglądarek. Zobacz xhr.spec.whatwg.org/#sync-warning (dotyczyasync
parametruopen
metody xhr , która używa jQuery).Nie korzystam
$.ajax
z funkcji$.post
i$.get
, więc jeśli muszę czekać na odpowiedź, używam tego:źródło
Podstawowy obiekt XMLHttpRequest (używany przez jQuery do wykonania żądania) obsługuje właściwość asynchroniczną. Ustaw na false . Lubić
źródło
Zamiast ustawiać async na false, co jest zwykle złym projektem, możesz rozważyć zablokowanie interfejsu użytkownika podczas operacji.
Można to łatwo osiągnąć dzięki obietnicom jQuery w następujący sposób:
dzięki temu możesz teraz:
Interfejs użytkownika będzie blokował się do momentu powrotu polecenia ajax
patrz jsfiddle
źródło
Myślę, że byłoby łatwiej, jeśli kodujesz swoją
success
funkcję, aby załadować odpowiednią stronę zamiast zwracaćtrue
lubfalse
.Na przykład zamiast zwrotu
true
możesz:W ten sposób, gdy wywoływana jest funkcja sukcesu, strona zostaje przekierowana.
źródło
W nowoczesnym JS możesz po prostu użyć
async
/await
, np .:Następnie wywołaj go w
async
funkcji takiej jak:źródło
async
funkcji”.Ponieważ nie widzę tu wspomnianego, pomyślałem, że zwrócę również uwagę na to, że instrukcja jQuery when może być bardzo przydatna w tym celu.
Ich przykład wygląda następująco:
Część „wtedy” nie zostanie wykonana, dopóki część „kiedy” się nie skończy.
źródło
Powinien poczekać, aż żądanie zostanie zakończone. Następnie zwrócę get body żądania z miejsca, w którym wywoływana jest funkcja.
źródło