等待ajax回复

时间:2011-07-06 03:09:54

标签: javascript asp.net ajax

我有一个名为GetRequest()的javascript函数,它使用$ .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 个答案:

答案 0 :(得分:1)

async:false与ajax选项一起传递..

$.ajax({
    type: "POST",
    async:false,
    .
    .
    .
 });

答案 1 :(得分:1)

您可以使用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
};

答案 2 :(得分:1)

将函数传递添加到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(根据定义是异步)的情况下。