Можно ли установить async:false для вызова $.getJSON?

Можно ли установить async: false при звонке $.getJSON() так что блоки вызова, а не быть асинхронными?

7 ответов

Решение

Вы должны сделать звонок, используя $.ajax() синхронно, вот так:

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

Это будет соответствовать в настоящее время, используя $.getJSON() как это:

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

Оба ответа неверны. Вы можете. Вам нужно позвонить

$.ajaxSetup({
async: false
});

до вашего вызова JSON AJAX. И вы можете установить его в true после повторных вызовов (если на странице есть другие случаи использования ajax, если вы хотите, чтобы они были асинхронными)

Я думаю, что вы оба правы. Более поздний ответ работает нормально, но он похож на настройку глобальной опции, поэтому вам нужно сделать следующее:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

В моем случае Джей Ди прав. Я должен добавить это до звонка.

$.ajaxSetup({
    async: false
});

В моем предыдущем коде у меня есть это:

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

Работает найди. Затем я перехожу на

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

Предупреждение не определено.

Если я добавлю эти три строки, предупреждение снова показывает данные.

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

Если вам просто нужно await чтобы избежать вложенности кода:

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

Ролл свой, например,

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

Я не думаю, что вы можете установить эту опцию там. Вам придется использовать jQuery.ajax() с соответствующими параметрами (в основном, getJSON просто оборачивает этот вызов в более простой API).

Другие вопросы по тегам