jquery ajax синхронный вызов beforeSend - PullRequest
11 голосов
/ 11 февраля 2011

У меня есть функция с именем:

function callAjax(url, data) {
 $.ajax(
   {
     url: url, // same domain
     data: data,
     cache: false,
     async: false, // use sync results
     beforeSend: function() {
       // show loading indicator
     },
     success: function() {
       // remove loading indicator 
     }
   }
  );
}

В коде я вызываю "callAjax" X несколько раз и хочу синхронно обновлять данные. Это сделано, как и ожидалось, но одна проблема: элемент загрузки не отображается в функции beforeSend. Если я переключаю async в true, это работает, но обновления не выполняются синхронно.

Я пробовал несколько вещей безуспешно. Я попытался поставить индикатор загрузки перед вызовом ajax, как это:

function callAjax(url, data) {
  // show loading div

  $.ajax(
    {
      // same as above
    }
   );
}

Но почему-то не хочет показывать индикатор загрузки. Я замечаю странное поведение, когда я помещаю «alert» в beforeSend, и в этом случае появляется индикатор загрузки, но я скорее не выскакиваю окно сообщения.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 11 февраля 2011

Выполнение синхронного вызова, подобного этому, похоже на установку окна «alert ()».Некоторые браузеры полностью останавливают то, что они делают, до получения ответа HTTP.

Таким образом, в вашем коде после того, как начинается ваш вызов функции "$ .ajax ()", nothing происходит до тех пор, пока не будет получен ответ, и следующий шаг в том, что касается вашего кода, будет обработчиком «успеха».

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

1 голос
/ 11 февраля 2011

Когда вы выполняете блокирующий ввод / вывод, программа останавливается до тех пор, пока ввод не будет получен, в словах JS при выполнении синхронного вызова программа останавливается и окно браузера останавливается (рисование не может быть выполнено), пока не получен ответ , В большинстве случаев можно избежать выполнения вызовов Syncronus и любого вида блокирования ввода-вывода. Однако представьте, что вы выполняете индикатор выполнения на Java или любом другом языке программирования, я думаю, вам нужно создать другой поток для управления индикатором выполнения.

Одна вещь, которую стоит попробовать в вашем случае, это вызвать ajax-вызов после некоторой задержки

//loading div stuff, 
//if your doing some animation here make sure to have Sufficient 
//time for it. If its just a regular show then use a time delay of 100-200
setTimeout( ajaxCall, 500 );

РЕДАКТИРОВАТЬ ajaxcall в setTimeout, Пример

0 голосов
/ 11 февраля 2011

Это то, что вы ищете - .ajaxStart ()

Это будет срабатывать, когда начинается любое событие ajax

http://api.jquery.com/ajaxStart/

Они даже дают определенныйПример, аналогичный тому, что вы пытаетесь выполнить:

 $("#loading").ajaxStart(function(){
   $(this).show();
 });

Затем вы можете использовать функцию .ajaxStop ()

$("#loading").ajaxStop(function(){
      $(this).hide();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...