jQuery: esecuzione di richieste AJAX sincrone


187

Ho fatto un po 'di jQuery in passato, ma sono completamente bloccato su questo. Conosco i pro e i contro dell'utilizzo di chiamate sincrone ajax, ma qui sarà richiesto.

La pagina remota viene caricata (controllata con firebug), ma non viene mostrato alcun ritorno.

Cosa devo fare di diverso per rendere la mia funzione per tornare correttamente?

function getRemote() {

    var remote;

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

    return remote;

}

Il tuo codice sembra a posto. che cosa sta tornando? Ci sono errori js?
ShankarSangoli,

11
Lo trovo piuttosto ironico - Mi stai chiedendo come eseguire l'operazione "Asincrono JavaScript e XML", in modo sincrono. Ciò di cui hai veramente bisogno per esibirti è un "SJAX".
VitalyB,

3
Nota: la specifica ha iniziato a deprecare le richieste AJAX sincrone.
Léo Lam,

2
sembra che l'affermazione "[sincrono] sarà richiesto" indica una mancanza di comprensione dei motori JavaScript, quindi un'app mal progettata. Vorrei capire se ci sono casi in cui è richiesta la sincronizzazione.
pmont,

15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.O una comprensione molto buona: se si desidera effettuare una chiamata AJAX onbeforeunload, l'utilizzo di una richiesta sincrona è in realtà il modo consigliato (poiché la finestra del browser sarebbe scomparsa prima che la richiesta restituisse diversamente). In ogni caso, dice chiaramente: "Conosco i pro ei contro dell'utilizzo di chiamate sincrone ajax" ... Forse gli credi?
Stijn de Witt,

Risposte:


298

Mentre stai facendo una richiesta sincrona, dovrebbe essere così

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

Esempio: http://api.jquery.com/jQuery.ajax/#example-3

NOTA: L' impostazione della proprietà asincrona su false è obsoleta e in fase di rimozione ( collegamento ). Molti browser tra cui Firefox e Chrome hanno già iniziato a stampare un avviso nella console se si utilizza questo:

Cromo:

XMLHttpRequest sincrono sul thread principale è obsoleto a causa dei suoi effetti dannosi per l'esperienza dell'utente finale. Per ulteriori informazioni, consultare https://xhr.spec.whatwg.org/ .

Firefox:

XMLHttpRequest sincrono sul thread principale è obsoleto a causa dei suoi effetti dannosi per l'esperienza dell'utente finale. Per ulteriori informazioni http://xhr.spec.whatwg.org/


16
Nota che responseTextrestituisce sempre una stringa. Se ti aspetti JSON, avvolgi $.ajaxconJSON.parse .
usandfriends

6
Nota: xhr.spec.whatwg.org/#the-open()-method Le richieste sincronizzate sono obsolete ...
teynon

5
@ Tom E così erano i tag <i>e <b>. Il mio consiglio: continua a utilizzare queste funzionalità in modo che non scompaiano.
Stijn de Witt,

1
poiché questo blocca il browser, ha senso aggiungere un timeout: 5000 o giù di lì alle opzioni.
commonpike

1
@usandfriends for String Analizza per oggetto è più sicura da usare al posto di jQuery.parseJSON JSON.parse stackoverflow.com/questions/10362277/...
Antone

33

Stai utilizzando la funzione Ajax in modo errato. Poiché è sincrono, restituirà i dati in linea in questo modo:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;

17

quanto è remoto questo url? è dello stesso dominio? il codice sembra a posto

prova questo

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;

Sì! Stesso dominio e tutto il resto. remote_urlè definito correttamente e la chiamata AJAX viene eseguita correttamente come indicato (controllato con firebug). Solo nessun ritorno!
Industriale

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;
        }
    });
}

7
Si prega di includere alcune spiegazioni sul perché questo aiuterà l'OP.
Krillgar,

È buona norma restituire un oggetto json dal lato server. Ti dà più controllo. Tuttavia, è necessario aggiungere dataType: "json" ai parametri $ .ajax sopra.
jjwdesign,

Cosa significa: "Ti dà più controllo"?
grantwparks

3
Non correlato ma è possibile: return result.valid; // Questo è già un booleano
dpineda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.