web-dev-qa-db-fra.com

Est-il possible de définir async: false à l'appel $ .getJSON

Est-il possible de définir async: false lors de l'appel de $.getJSON() afin que l'appel soit bloqué plutôt que d'être asynchrone?

97
Chendur Pandian

Vous devez passer l'appel en utilisant $.ajax() pour le faire de manière synchrone, comme ceci:

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

Ceci correspondrait à l’utilisation actuelle de $.getJSON() comme ceci:

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

Les deux réponses sont fausses ... vous le pouvez. Vous devez appeler 

$.ajaxSetup({
async: false
});

avant votre appel json ajax. Et vous pouvez le définir sur true après les rappels d'appels (s'il y a d'autres utilisations d'ajax sur la page si vous les voulez asynchrones)

45
velja

Je pense que vous avez raison tous les deux. La dernière réponse fonctionne bien, mais elle ressemble à une option globale.

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });
16
webdev

Dans mon cas, Jay D a raison. Je dois ajouter ceci avant l'appel.

$.ajaxSetup({
    async: false
});

Dans mon code précédent, j'ai ceci:

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

Cela fonctionne trouver. Puis je change pour

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

L'alerte n'est pas définie.

Si j'ajoute ces trois lignes, l'alerte affiche à nouveau les données.

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

Rouler votre propre par exemple.

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

Je ne pense pas que vous puissiez définir cette option ici. Vous devrez utiliser jQuery.ajax () avec les paramètres appropriés (fondamentalement, getJSON encapsule cet appel dans une API plus simple).

0
Daff

Si vous avez juste besoin de await pour éviter l’imbrication de code:

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