È possibile impostare async: false alla chiamata $ .getJSON


105

È possibile impostare async: falsedurante la chiamata in $.getJSON()modo che la chiamata si blocchi anziché essere asincrona?


1
Metti il ​​tuo codice nella richiamata ... C'è una ragione per cui questo è deprecato - è una cattiva idea
Milney

1
@Milney - Molto strano ... Ufficialmente, è deprecato; in realtà, è non è . Se fosse davvero deprecato, la possibilità di effettuare una chiamata AJAX di sincronizzazione o uno switch $ ajax.setup sarebbe stata abbandonata in jQuery 3. In effetti, una chiamata di sincronizzazione è occasionalmente molto utile, ad esempio quando si inizializzano le globali con Dati JSON, quando hai altre globali che si basano sul primo batch. (Imballare l'intero processo di inizializzazione nella funzione di callback potrebbe essere molto complicato in determinate circostanze.)
Brice Coustillas

Penso che le richieste XHR sincrone o il codice di ristrutturazione risponderebbero a questo caso.
Chetabahana

Risposte:


154

È necessario effettuare la chiamata utilizzando $.ajax()in modo sincrono, in questo modo:

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    //stuff
    //...
  }
});

Ciò corrisponderebbe attualmente utilizzando in $.getJSON()questo modo:

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});

23
Ho scoperto che il metodo conveniente $ .getJSON () non è quasi mai utile e finisco sempre per usare $ .ajax ().
Jacob Marble

posso usarlo anche per le chiamate POST?
Hitesh

@hitesh sì, aggiungeresti anche type: 'POST'un'opzione per trasformarlo in un post, anche se non vuoi usarlo a async: falsemeno che non sia davvero necessario - bloccherà l'interfaccia utente.
Nick Craver

1
Cosa dovrebbero essere i "myData" in questo caso? Quando elimino i dati: myData funziona completamente .. Abbastanza nuovo per le chiamate ajax!
nclsvh

2
Mi sono appena imbattuto nel seguente nuovo problema: "XMLHttpRequest sincrono al di fuori dei lavoratori è in procinto di essere rimosso dalla piattaforma web in quanto ha effetti dannosi per l'esperienza dell'utente finale. (Questo è un processo lungo che richiede molti anni). non passare false per l'argomento async quando l'oggetto globale dell'oggetto impostazioni di ingresso è un oggetto Window. I programmi utente sono vivamente incoraggiati a mettere in guardia su tale utilizzo negli strumenti di sviluppo e possono provare a lanciare un'eccezione InvalidAccessError quando si verifica. "
Ken Sharp

46

Entrambe le risposte sono sbagliate. Puoi. Devi chiamare

$.ajaxSetup({
async: false
});

prima della tua chiamata json ajax. E puoi impostarlo su true dopo la ripetizione della chiamata (se ci sono altri usi di ajax sulla pagina se li vuoi asincroni)


1
Ho appena riletto quella parte dei documenti. Ecco la parte che parla di ajaxSetup: api.jquery.com/jQuery.ajaxSetup E qui ci sono le opzioni: api.jquery.com/jQuery.ajax Dice chiaramente: "async Default: true Per impostazione predefinita, tutte le richieste vengono inviate in modo asincrono ( cioè questo è impostato su true per impostazione predefinita). Se hai bisogno di richieste sincrone, imposta questa opzione su false. Le richieste tra domini e dataType: le richieste "jsonp" non supportano l'operazione sincrona. "JSONP non è JSON, quindi penso ancora di esserlo fin dall'inizio. Scriverò un esempio più tardi quando avrò un po 'di tempo.
velja

7
Questo è un commento in ritardo ma ... quali sono le "entrambe" risposte sbagliate? Vedo che la risposta di @Nick Craver è accettabile e non "confusa" con le impostazioni globali AJAX (se altre richieste vengono
attivate

1
Funziona, ma questo lo applicherebbe a tutte le richieste ajax che fai nella pagina. Quindi ho intenzione di downvote perché non lo consiglierei
GabrielBB

3
Questa è una risposta di qualità molto bassa
Brian Webster

1
-1: Rendere le cose sincrone può essere costoso. Dovresti assolutamente farlo su base per chiamata a meno che il tuo progetto non lo richieda assolutamente ogni volta. La tua risposta suggerisce di configurare globalmente tutte le chiamate a $.ajax(e i successivi wrapper abbreviati $.getJSON, ad esempio $.get, ecc.) In modo che siano sincrone. Inoltre, la documentazione suggerisce anche di non usare questo: "Descrizione: imposta i valori predefiniti per le future richieste Ajax. Il suo utilizzo non è raccomandato."
Carrie Kendall

18

Penso che entrambi abbiate ragione. La risposta successiva funziona bene ma è come impostare un'opzione globale, quindi devi fare quanto segue:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

Nel mio caso, Jay D ha ragione. Devo aggiungere questo prima della chiamata.

$.ajaxSetup({
    async: false
});

Nel mio codice precedente, ho questo:

var jsonData= (function() {
    var result;
    $.ajax({
        type:'GET',
        url:'data.txt',
        dataType:'json',
        async:false,
        success:function(data){
            result = data;
        }
    });
    return result;
})();
alert(JSON.stringify(jsonData));

Funziona trovare. Quindi cambio in

var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

L'avviso non è definito.

Se aggiungo queste tre righe, l'avviso mostra nuovamente i dati.

$.ajaxSetup({
    async: false
});
var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

1

Se devi solo awaitevitare di annidare il codice:

let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
    json = data;
    done();
}));

0

Non penso che tu possa impostare quell'opzione lì. Dovrai utilizzare jQuery.ajax () con i parametri appropriati (in pratica getJSON avvolge anche quella chiamata in un'API più semplice).


0

Roll il tuo ad es

function syncJSON(i_url, callback) {
  $.ajax({
    type: "POST",
    async: false,
    url: i_url,
    contentType: "application/json",
    dataType: "json",
    success: function (msg) { callback(msg) },
    error: function (msg) { alert('error : ' + msg.d); }
  });
}

syncJSON("/pathToYourResouce", function (msg) {
   console.log(msg);
})
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.