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 - вместо этого вы вызываете из него одну функцию, которая запускает ваш код.