Чи можна встановити виклик async: false на $ .getJSON


105

Чи можна встановити async: falseпри виклику $.getJSON()так, щоб блоки викликів замість того, щоб бути асинхронними?


1
Просто поставте свій код у зворотному
дзвінку

1
@Milney - Дуже дивно ... Офіційно це є застарілим; насправді це не так . Якби насправді застаріло, можливість зробити або синхронізуючий AJAX-виклик, або комутатор $ ajax.setup, була б відкинута в jQuery 3. Насправді, виклик синхронізації іноді дуже корисний, наприклад, при ініціалізації глобалів з Дані JSON, коли у вас є інші глобалі, які покладаються на першу партію. (Упаковка всього процесу ініціалізації у функції зворотного виклику за певних обставин може бути дуже хитрою.)
Бріс Кустіллас

Я думаю, що синхронні запити XHR або код реструктуризації відповіли б на цей випадок.
Четабахана

Відповіді:


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 так, ви додасте type: 'POST'параметр, щоб також перетворити його на публікацію - хоча ви не хочете користуватися, async: falseякщо вам це не потрібно - це заблокує інтерфейс користувача.
Нік Крейвер

1
Якою має бути "myData" в цьому випадку? Коли я видаляю дані: myData повністю спрацьовує. Досить новим для Ajax дзвінків!
nclsvh

2
Щойно натрапив на таку нову проблему: "Синхронний XMLHttpRequest поза робочими сторонами перебуває в процесі видалення з веб-платформи, оскільки це згубно впливає на досвід кінцевого користувача. (Це довгий процес, який займає багато років.) Розробники повинні не передавати помилки для аргументу async, коли глобальним об'єктом об'єкта настройки є об’єкт Window. Користувачам користувачів настійно рекомендується попередити про таке використання в інструментах розробника та можуть експериментувати з викиданням винятку InvalidAccessError, коли воно відбувається. "
Кен Шарп

46

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

$.ajaxSetup({
async: false
});

перед тим, як зателефонувати json Ajax. І ви можете встановити це значення true після повторного виклику (якщо на сторінці є інші звички ajax, якщо ви хочете, щоб вони асинхронізували)


1
Я просто перечитав цю частину документів. Ось частина, яка розповідає про ajaxSetup: api.jquery.com/jQuery.ajaxSetup І ось варіанти: api.jquery.com/jQuery.ajax Тут чітко написано: "async Default: true За замовчуванням всі запити надсилаються асинхронно ( тобто за замовчуванням встановлено значення true). Якщо вам потрібні синхронні запити, встановіть цей параметр значення false. Запити між доменами та dataType: "jsonp" запити не підтримують синхронну роботу. "JSONP не є JSON, тому я все ще думаю, що я прямо з початку. Я напишу приклад пізніше, коли отримаю певний час.
вівта

7
Це пізній коментар, але ... які відповіді "обох" є помилковими? Я бачу, що відповідь від @Nick Craver є і прийнятною, і не «безладно» з глобальними налаштуваннями AJAX (якщо інші запити спрацьовують одночасно)
сканліф

1
Це працює, але це застосовується до всіх запитів ajax, які ви робите на сторінці. Тож я збираюсь подати заявку, як я б не рекомендував цього
ГабріельBB

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

1

Якщо вам просто потрібно awaitуникати вкладеного коду:

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

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);
})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.