Как я могу остановить $ .post в jQuery, работающем асинхронно? - PullRequest
5 голосов
/ 13 июня 2011

У меня есть следующие звонки:

getData(0);
getData(1);
getData(2);

Они вызывают функцию javascript:

function getData(Code) {
  $.post('/adminA/GetData',
                { Code: Code },
  function (data) {

Проблема в том, что мои данные возвращаются не по порядку. Есть ли способ, чтобы я мог вернуть данные в порядке?

Ответы [ 5 ]

17 голосов
/ 13 июня 2011

Другой альтернативой является использование ajaxSetup

function getData(Code) {
  $.ajaxSetup({async: false});
  $.post('/adminA/GetData',{ 
        Code: Code },  function (data) {
         // Do Something
        }); 
   $.ajaxSetup({async: true}); //So as to avoid any other ajax calls made sybchrounously
}
9 голосов
/ 13 июня 2011

Вместо этого вы можете использовать $ .ajax и установить для async значение false.

6 голосов
/ 13 июня 2011

Синхронный вызов этих трех запросов ajax приведет к зависанию вашего браузера.Вам лучше использовать отложенные объекты jQuery.Попробуйте это:

function getData(Code) {
    return $.post('/adminA/GetData', { Code: Code }, function (data) {/*etc.*/});
}

getData(0).done(function() {
    getData(1).done(function() {
        getData(2);
   });
});

Приложение

Вам также следует рассмотреть возможность объединения ваших вызовов в один и изменения логики сервера для его обработки.В конечном итоге это будет быстрее, чем три запроса:

function getData(firstCode, secondCode, thirdCode) {
    $.post('/adminA/GetData', {
        codeOne   : firstCode,
        codeTwo   : secondCode,
        codeThree : thirdCode
    }, function (data) {/*etc.*/});
2 голосов
/ 13 июня 2011

Вы можете использовать $.ajaxSetup({ asynch: false }) из документации jQuery:

jQuery.ajaxSetup (опции)

опции
Набор пар ключ / значение, которые конфигурируют Ajax-запрос по умолчанию.Все параметры являются необязательными.

Это позволит настроить параметры для всех запросов ajax с использованием jQuery.

0 голосов
/ 13 июня 2011

Как говорится в другом ответе, вы можете использовать $ .ajax и установить для async значение false.Однако это приведет к зависанию браузера до завершения всех вызовов.Вместо этого я хотел бы, чтобы каждый вызов ajax вызывал следующий в очереди в обратном вызове.Таким образом, он остается асинхронным, поэтому браузер не зависает.

Что-то вроде:

 function getData(Code) {
    $.post('/adminA/GetData',
                { Code: Code },
                function (data) {
                    getData(Code+1)
                });
 }

Очевидно, что что-то скажет, когда прекратить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...