У меня есть виджет JavaScript, который обеспечивает стандартные точки расширения. Одним из них является beforecreate
функция. Он должен вернуться, false
чтобы предотвратить создание элемента.
Я добавил Ajax-вызов в эту функцию, используя jQuery:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
Но я хочу, чтобы мой виджет не создавал элемент, поэтому я должен вернуться false
в функции mother, а не в функции обратного вызова. Есть ли способ выполнить синхронный AJAX-запрос с помощью jQuery или любого другого API в браузере?
javascript
jquery
ajax
asynchronous
Артем Тихомиров
источник
источник
beforecreate
.Ответы:
Из документации jQuery : вы указываете асинхронную опцию как false, чтобы получить синхронный Ajax-запрос. Тогда ваш обратный вызов может установить некоторые данные, прежде чем ваша материнская функция продолжит работу.
Вот как будет выглядеть ваш код, если он будет изменен в соответствии с предложением:
источник
async: false
все еще поддерживается в jQuery> = 1.8. Возможность использоватьasync: false
с jqXHR ($.Deferred
) - это то, что устарело. Другими словами, нужно использовать более новые параметры обратного вызова success / error / complete вместо устаревших методов, напримерjqXHR.done()
.Вы можете перевести установку Ajax в JQuery в синхронный режим, вызвав
А затем выполните ваши Ajax-вызовы, используя
jQuery.get( ... );
Затем просто включите его снова один раз
Я думаю, что это работает так же, как предложено @Adam, но это может быть полезно для кого-то, кто действительно хочет перенастроить свой
jQuery.get()
илиjQuery.post()
более сложныйjQuery.ajax()
синтаксис.источник
$.ajax()
». ;)Отличное решение! Когда я попытался реализовать это, я заметил, что если я возвращаю значение в предложении успеха, оно возвращается как неопределенное. Я должен был сохранить его в переменной и вернуть эту переменную. Это метод, который я придумал:
источник
getWhatever
. Таким образом , вы возвратили ничего ИЭundefined
от вашегоgetWhatever
.Во всех этих ответах упущено, что выполнение вызова Ajax с помощью async: false приведет к зависанию браузера до завершения запроса Ajax. Использование библиотеки управления потоком данных решит эту проблему, не отключая браузер. Вот пример с Frame.js :
источник
источник
getURL
противget
? Почему один браузер зависает?" и т.д.Примечание: вы не должны использовать
async: false
из-за этого предупреждения:Chrome даже предупреждает об этом в консоли:
Это может сломать вашу страницу, если вы делаете что-то подобное, так как это может перестать работать в любой день.
Если вы хотите сделать это так, как если бы он был синхронным, но все еще не блокировался, вам следует использовать async / await и, возможно, также некоторый ajax, основанный на обещаниях, таких как новый Fetch API.
Правка chrome работает над запретом синхронизации XHR при закрытии страницы, когда страница перемещается или закрывается пользователем. Это включает в себя загрузку, выгрузку, скрытие страниц и изменение видимости.
если это ваш вариант использования, вы можете вместо этого взглянуть на navigator.sendBeacon
На странице также можно отключить синхронизацию req либо с помощью заголовков http, либо с помощью атрибута allow iframe.
источник
await fetch(url)
вызов вtry... catch
блок, чтобы перехватить любые асинхронные ошибки.async
в начале, так что вы можете простоfoo().catch(...)
поймать егоbeforeunload
но затем отменил изменение обратно после отрицательного отзыва bugs.chromium.org/p/chromium/issues/detail?id=952452Имейте в виду, что если вы делаете междоменный Ajax-вызов (используя JSONP ) - вы не можете делать это синхронно,
async
jQuery будет игнорировать этот флаг.Для JSONP-звонков вы можете использовать:
источник
С
async: false
вами вы получите заблокированный браузер. Для неблокирующего синхронного решения вы можете использовать следующее:ES6 / ECMAScript2015
С ES6 вы можете использовать генератор и библиотеку co :
ES7
С ES7 вы можете просто использовать asyc await:
источник
async function
к beforecreatebeforecreate: async function(....
и удалить асинхронную функцию, вызываемую самим собойЯ использовал ответ, данный Carcione, и изменил его, чтобы использовать JSON.
Я добавил DATATYPE из «» JSON и изменил .responseText к responseJSON .
Я также получил статус, используя свойство statusText возвращаемого объекта. Обратите внимание, что это состояние ответа Ajax, а не допустимость JSON.
Серверная часть должна возвращать ответ в правильном (правильно сформированном) JSON, иначе возвращаемый объект будет неопределенным.
Есть два аспекта, которые следует учитывать при ответе на исходный вопрос. Один из них говорит Ajax выполнять синхронно (путем установки async: false ), а другой возвращает ответ через оператор возврата вызывающей функции, а не в функцию обратного вызова.
Я также попробовал это с POST, и это сработало.
Я изменил GET на POST и добавил данные: postdata
Обратите внимание, что приведенный выше код работает только в случае, когда async имеет значение false . Если бы вы установили async: true, возвращаемый объект jqxhr был бы недействительным во время возврата вызова AJAX, только позже, когда завершился асинхронный вызов, но это слишком поздно для установки переменной ответа .
источник
Это пример:
источник
async false
решение на основе обещаний. Это только блокирует браузер без какой-либо выгоды.ajax
вызовы которых уже возвращаются) и.then()
илиdone()
(как это уже показано). Блокировка браузера - очень плохой пользовательский опыт. Как я уже сказал, наличиеasync: false
в этом примере - пустая трата времени.Во-первых, мы должны понять, когда мы используем $ .ajax и когда мы используем $ .get / $. Post
Когда нам требуется низкоуровневый контроль над запросом ajax, таким как настройки заголовка запроса, настройки кэширования, синхронные настройки и т. Д., Тогда мы должны использовать $ .ajax.
$ .get / $. post: Когда нам не требуется контроль низкого уровня над запросом ajax. Только просто получить / отправить данные на сервер. Это стенография
и, следовательно, мы не можем использовать другие функции (синхронизация, кеширование и т. д.) с $ .get / $. post.
Следовательно, для низкоуровневого контроля (синхронизация, кэш и т. Д.) Над ajax-запросом мы должны использовать $ .ajax
источник
это моя простая реализация запросов ASYNC с помощью jQuery. Я надеюсь, что это поможет любому.
источник
Поскольку
XMLHttpReponse
синхронная операция устарела, я нашел следующее решениеXMLHttpRequest
. Это позволяет упорядоченным AJAX-запросам оставаться асинхронными по своей природе, что очень полезно для одноразовых токенов CSRF.Он также прозрачен, поэтому библиотеки, такие как jQuery, будут работать без проблем.
источник
Поскольку первоначальный вопрос был о том
jQuery.get
, стоит упомянуть здесь, что (как упомянуто здесь ) можно использоватьasync: false
в,$.get()
но в идеале избегать этого, поскольку асинхронныйXMLHTTPRequest
устаревший (и браузер может выдавать предупреждение):источник
Набор
asyn:false
запрос ajax, чтобы сделать его синхронным.Вот пример кода:
Это может сделать экран не отвечает.
источник