JQuery.ajax() метод async вариант устарел, что теперь?

Как и в jQuery 1.8, использование async:false в jQuery.ajax() устарело. < ш > Но сколько веб-страниц вы видели с помощью "экрана загрузки", в то время как в фоновом режиме происходит связь AJAX? Я, вероятно, видел тысячи из них.

Мое дело в том, что я пишу мобильное приложение, которое нужно загрузить файл языка. И вначале я загружаю языковой файл, и я извлекаю текст кнопок и других элементов GUI из языкового файла.

Это действительно плохо для меня. Поскольку, если файл языка отсутствует, графический интерфейс не должен отображаться. Итак, как мне его решить? Поместите весь мой код в обратный вызов success? Это не похоже на хорошую практику кодирования для меня. Могу ли я решить его по-другому?

Ответ 1

Решение состоит в том, чтобы вручную добавить наложение, чтобы пользователь не мог взаимодействовать с интерфейсом, а затем удалять его после выполнения запроса AJAX.

$(function() {
    show_overlay();        

    $.ajax({
        // Query to server
    }).done(function() {
        // Verify good data
        // Do stuff
        remove_overlay();
    });
});

Ответ 2

Я прочитал официальное обсуждение в билете об устаревании этого параметра, и вот что я понял:

  • Проблема заключается в том, что реализация Promise (1) для синхронизации AJAX дает им накладные расходы.

  • Есть тонны реальных случаев использования синхронизации AJAX, например. сохраняя состояние до выгрузки страницы. Поэтому эта функция останется, но способ ее использования может измениться.

  • Ближайшим решением (посадкой в ​​1.8?) является поддержка только обратных вызовов (но не Promises), если async - false.

Чтобы заключить: продолжайте использовать async: false, если вам нужно, но остерегайтесь его недостатков (блокировка виртуальной машины). Не беспокойтесь, вам будет предоставлена ​​альтернатива, если эта функция когда-либо удаляется из $.ajax().

Ответ 3

Я бы поспорил, что многие из этих 1000 страниц фактически не блокируют пользовательский интерфейс, ожидая вызова AJAX. Вместо этого они, вероятно, скрывают пользовательский интерфейс с экраном ожидания во время вызова, а затем удаляют его в обработчике ответов.

Есть много способов скрыть пользовательский интерфейс (вы могли бы просто использовать диалоговое окно JQuery UI Dialog, установленное в Modal и не имеющее кнопок выхода или закрытия), поэтому я оставлю это решение до вас. Но расположение кода было бы примерно таким:

var someFunction = function () {

    // any pre-conditions to the logic
    // obscure the UI here

    $.ajax({
        url: 'ajax/test.html',
        success: function(data) {

            // handle the response
            // show the UI again

        },
        error: function(data) {

            // handle the response
            // show the UI again

        }
    }); 
}

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

Ответ 4

Почему вы используете ajax для получения этого файла? Просто включите его, используя тег script.

В любом случае, вы не помещаете весь свой код в onSuccess - вместо этого вы вызываете из него одну функцию, которая запускает ваш код.