Как сделать запрос jquery "$.post" синхронным

Я искал это и избегал этой ошибки в моем списке исправлений ошибок уже давно, но Ive, наконец, дошел до конца списка, последний из которых должен сделать функцию return true/false, чтобы указать, проверка прошла успешно или нет.

Я использую ajax для сравнения определенных полей с теми, которые уже находятся в db, и по умолчанию метод $.post() работает асинхронно.

Я устанавливаю переменную внутри вызова onSuccess, и вызывающий метод не получает ответ из-за этого, поэтому все мои js/jquery не работают на страницеLoad... Я бы предпочел, если бы я мог продолжать использовать $.post.

Ответ 1

jQuery < 1,8

Могу ли я предложить использовать $.ajax() вместо $.post(), поскольку он более настраиваемый.

Если вы вызываете $.post(), например, например:

$.post( url, data, success, dataType );

Вы можете превратить его в эквивалент $.ajax():

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

Обратите внимание на async:false в конце объекта параметра $.ajax().

Здесь у вас есть полная информация о параметрах $.ajax(): jQuery.ajax() - Документация API jQuery.


jQuery >= 1.8 "async: false" уведомление об отказе

jQuery >= 1.8 не будет блокировать пользовательский интерфейс во время HTTP-запроса, поэтому мы должны использовать обходной путь, чтобы остановить взаимодействие с пользователем при условии обработки запроса. Например:

  • используйте плагин, например. BlockUI;
  • вручную добавьте наложение перед вызовом $.ajax(), а затем удалите его, когда вызывается обратный вызов AJAX .done().

Пожалуйста, посмотрите на этот ответ для примера.

Ответ 2

Если вам нужен синхронный запрос, установите для свойства async значение false для запроса. Проверьте jQuery AJAX Doc

Ответ 3

В документах Jquery: вы указываете опцию async как false, чтобы получить синхронный запрос Ajax. Тогда ваш обратный вызов может установить некоторые данные до того, как ваша материнская функция продолжит.

Вот как выглядел бы ваш код, если бы он был изменен, как было предложено:

beforecreate: function(node,targetNode,type,to) {
    jQuery.ajax({
         url:    url,
         success: function(result) {
                      if(result.isOk == false)
                          alert(result.message);
                  },
         async:   false
    });          
}

это потому, что $.ajax - единственный тип запроса, который вы можете установить асинхронность для