jQuery: Wykonywanie synchronicznych żądań AJAX

187

W przeszłości robiłem jQuery, ale utknąłem w tym całkowicie. Wiem o zaletach i wadach używania synchronicznych wywołań ajax, ale tutaj będzie to wymagane.

Strona zdalna jest ładowana (kontrolowana przez firebug), ale nie jest wyświetlany żaden zwrot.

Co powinienem zrobić inaczej, aby funkcja powróciła poprawnie?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}
Przemysłowy
źródło
Twój kod wygląda dobrze. co powraca? Czy są jakieś błędy JS?
ShankarSangoli,
11
Uważam, że to dość ironiczne - pytasz, jak wykonać synchroniczną operację „Asynchroniczne JavaScript i XML”. To, co naprawdę musisz wykonać, to „SJAX”.
VitalyB
3
Uwaga: specyfikacja zaczęła zastępować synchroniczne żądania AJAX.
Léo Lam
2
wydaje się, że stwierdzenie „wymagana będzie [synchronizacja]” wskazuje na brak zrozumienia silników JavaScript, a więc źle zaprojektowaną aplikację. Chciałbym zrozumieć, czy istnieją przypadki, w których naprawdę wymagana jest synchronizacja.
pmont
15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.Lub bardzo dobre zrozumienie: jeśli chcesz wykonać połączenie AJAX onbeforeunload, użycie żądania synchronicznego jest w rzeczywistości zalecanym sposobem (ponieważ okno przeglądarki zniknęłoby, zanim żądanie zwróci się inaczej). W każdym razie wyraźnie mówi: „Wiem o zaletach i wadach korzystania z synchronicznych wywołań ajax” ... Może po prostu mu uwierzyć?
Stijn de Witt

Odpowiedzi:

298

Tak jak powinno być w przypadku żądania synchronicznego

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

Przykład - http://api.jquery.com/jQuery.ajax/#example-3

UWAGA: Ustawienie właściwości asynchronicznej na wartość false jest przestarzałe i jest w trakcie usuwania ( link ). Wiele przeglądarek, w tym Firefox i Chrome, już zaczęło drukować ostrzeżenie w konsoli, jeśli używasz tego:

Chrom:

Synchroniczne XMLHttpRequest w głównym wątku jest przestarzałe ze względu na jego szkodliwy wpływ na doświadczenie użytkownika końcowego. Aby uzyskać więcej pomocy, sprawdź https://xhr.spec.whatwg.org/ .

Firefox:

Synchroniczne XMLHttpRequest w głównym wątku jest przestarzałe ze względu na jego szkodliwy wpływ na doświadczenie użytkownika końcowego. Aby uzyskać więcej pomocy http://xhr.spec.whatwg.org/

Dogbert
źródło
16
Zauważ, że responseTextzawsze zwraca ciąg. Jeśli spodziewasz JSON, okłady $.ajaxz JSON.parse.
usandfriends
6
Uwaga: xhr.spec.whatwg.org/#the-open()-method Synchrounous żądania są przestarzałe ...
teynon
5
@Tom Tak jak i <i><b> tagi i . Moja rekomendacja: używaj tych funkcji, aby nie zniknęły.
Stijn de Witt
1
ponieważ powoduje to zablokowanie przeglądarki, warto dodać limit czasu: około 5000 do opcji.
commonpike
1
@usandfriends Aby parsować ciąg znaków do obiektu, bezpieczniej jest użyć jQuery.parseJSON zamiast JSON.parse stackoverflow.com/questions/10362277/…
AntonE
33

Używasz nieprawidłowo funkcji ajax. Ponieważ jest zsynchronizowany, zwraca dane w taki sposób:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;
Jake
źródło
17

jak daleko jest ten adres? czy to z tej samej domeny? kod wygląda dobrze

Spróbuj tego

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;
Mózg
źródło
Tak! Ta sama domena i wszystko. remote_urljest poprawnie zdefiniowany, a wywołanie AJAX jest poprawnie wykonywane, jak wspomniano (kontrolowane przez firebug). Po prostu nie ma powrotu!
Przemysłowy
3
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}
użytkownik3116547
źródło
7
Proszę podać wyjaśnienie, dlaczego pomoże to PO.
krillgar
Dobrą praktyką jest zwracanie obiektu json po stronie serwera. Daje to większą kontrolę. Ale musisz dodać dataType: „json” do powyższych parametrów $ .ajax.
jjwdesign
Co to znaczy: „Daje ci większą kontrolę”?
grantwparks
3
Nie powiązane, ale możesz: zwrócić wynik. // To już jest wartość logiczna
dpineda