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

105

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

ACP
источник
1
Просто введите свой код в обратный вызов .... Есть причина, по которой это устарело - это плохая идея
Милни
1
@Milney - Очень странно ... Официально это является устаревшим; на самом деле это не так . Если бы это было действительно устаревшим, возможность сделать либо вызов синхронизации AJAX, либо переключатель $ ajax.setup была бы исключена в jQuery 3. Фактически, вызов синхронизации иногда бывает очень полезен, например, при инициализации глобальных объектов с помощью Данные JSON, когда у вас есть другие глобальные объекты, которые полагаются на первый пакет. (Упаковать весь процесс инициализации в функцию обратного вызова может быть очень сложно при определенных обстоятельствах.)
Брис Кустиллас, 01
Я думаю, что синхронные запросы XHR или код реструктуризации подойдут для этого случая.
Chetabahana 02

Ответы:

154

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

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

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

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});
Ник Крейвер
источник
23
Я обнаружил, что удобный метод $ .getJSON () почти никогда не будет полезным и всегда заканчивается использованием $ .ajax ().
Джейкоб Марбл
Могу ли я использовать это и для вызова POST?
Hitesh
@hitesh да, вы бы также добавили type: 'POST'опцию, чтобы превратить это в сообщение - хотя вы не хотите использовать, async: falseесли вам действительно не нужно - это заблокирует пользовательский интерфейс.
Ник Крейвер
1
Что в этом случае должны быть «myData»? Когда я полностью удаляю data: myData, он работает .. Довольно ново для вызовов ajax!
nclsvh 05
2
Только что столкнулся со следующей новой проблемой: «Синхронный XMLHttpRequest за пределами рабочих процессов находится в процессе удаления с веб-платформы, поскольку он отрицательно сказывается на опыте конечных пользователей (это длительный процесс, который занимает много лет). Разработчики должны не передавать false для аргумента async, когда глобальный объект объекта настроек входа является объектом Window. Агентам пользователей настоятельно рекомендуется предупреждать о таком использовании в инструментах разработчика и они могут поэкспериментировать с выдачей исключения InvalidAccessError, когда оно возникает ".
Кен Шарп
46

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

$.ajaxSetup({
async: false
});

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

velja
источник
1
Я только что перечитал эту часть документации. Вот часть, в которой говорится об ajaxSetup: api.jquery.com/jQuery.ajaxSetup И вот варианты: api.jquery.com/jQuery.ajax В нем четко сказано: «async Default: true По умолчанию все запросы отправляются асинхронно ( т.е. по умолчанию установлено значение true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Междоменные запросы и dataType: запросы «jsonp» не поддерживают синхронную операцию. «JSONP - это не JSON, поэтому я все еще думаю, что с самого начала. Я напишу пример позже, когда у меня будет время.
velja
7
Это запоздалый комментарий, но ... какие "оба" ответа неверны? Я вижу, что ответ от @Nick Craver является приемлемым и не «беспорядочным» с глобальными настройками AJAX (если одновременно будут срабатывать другие запросы)
scunliffe
1
Это работает, но это применимо ко всем запросам ajax, которые вы делаете на странице. Так что я собираюсь проголосовать против, поскольку я бы не рекомендовал это
GabrielBB
3
Это ответ очень низкого качества
Брайан Вебстер
1
-1: синхронизация может быть дорогостоящей. Вы определенно должны делать это для каждого вызова, если только ваш проект не требует этого каждый раз. Ваш ответ предполагает , что вы глобально настроить все вызовы $.ajax(и последующие сокращенные обертки , т.е. $.getJSON, $.getи т.д.) , чтобы быть синхронными. Более того, в документации даже предлагается не использовать это: «Описание: установить значения по умолчанию для будущих запросов Ajax. Его использование не рекомендуется».
Кэрри Кендалл,
18

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

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });
веб-разработчик
источник
10

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

$.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));
Ronrun
источник
1

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

let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
    json = data;
    done();
}));
k06a
источник
0

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

Дафф
источник
0

Сверните свой собственный, например

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);
})
Stonedecroze
источник