жду ответа ajax - PullRequest
       3

жду ответа ajax

0 голосов
/ 06 июля 2011

У меня есть функция JavaScript, называемая GetRequest (), которая вызывает сервер с помощью $ .ajax () и получает строку json:

function GetRequest(ThePage) {

RequestedPage = parseInt(ThePageNumber,10);

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "../Pages/MyPage.aspx/GetPage",
    data: "{'ThePage':'" + ThePageNumber + "'}",
    dataType: "json",
    success: function (msg) {
        var data = msg.hasOwnProperty("d") ? msg.d : msg;
        OnSucessCallBack(data);
    },
    error: function (xhr, status, error) {
        alert(xhr.statusText);
    }
});

};

У меня есть функция с именем ShowData (), которая вызывает GetRequest ()и должен ждать, пока GetRequest получит свои данные, прежде чем продолжить.

function ShowData() {

//some code that determines the page number

GetRequest(ThePageNumber);

//wait until the data is in

};

Я использую GetRequest в нескольких местах, поэтому не могу использовать его функцию успеха в контексте ShowData.

Как мнезаставить мою функцию ShowData приостановить ее выполнение до завершения GetRequest?Я думал об изменении функции OnSuccessCallBack и определил, какая функция изначально вызывала GetRequest (), но я не уверен, как лучше всего это сделать.

Спасибо за ваши предложения.

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Вы можете сделать свой звонок только синхронным, используя префильтры ajax:

function ShowData() {
    //some code that determines the page number
    $.ajaxPrefilter( function( options, originalOptions, jqXHR ) {
        options.async = false;
    });

    GetRequest(ThePageNumber);
    //wait until the data is in
};
1 голос
/ 06 июля 2011

добавить функцию передачи в GetRequest следующим образом:

function GetRequest(pageNumber, successCallback){

  //I admit this isn't "elegant" but it's most assuredly readable
  var callback;
  if (successCallback == null) {
    callback = //default callback definition here
  } else {
    callback = successCallback;
  }

  //do everything else the same here 
  //except use the callback defined above
}

Это дает вам возможность добавить отдельный обработчик обратного вызова для onsuccess

В качестве альтернативы, выполните то же самое, что ивыше, но используйте обработчик «onComplete», если вам не нужны данные специально для возврата (они не отображаются так, как вы).

Я собираюсь настоятельно рекомендовать использовать обратные вызовы для асинхронныхкод вместо того, чтобы пытаться включить в синхронизацию запросов.Гораздо лучше просто принять стиль кодирования, который вращается вокруг асинхронных запросов при работе в javascript, особенно когда вы уже выполняете AJAX (который по определению предназначен для асинхронного).

1 голос
/ 06 июля 2011

Pass async:false вместе с опциями ajax ..

$.ajax({
    type: "POST",
    async:false,
    .
    .
    .
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...