32

可能重复:
如何从异步调用返回响应?

我正在使用 Jquery Ajax 调用服务来更新值。

function ChangePurpose(Vid, PurId) {
    var Success = false;
    $.ajax({
        type: "POST",
        url: "CHService.asmx/SavePurpose",
        dataType: "text",
        data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            Success = true;//doesn't go here
        },
        error: function (textStatus, errorThrown) {
            Success = false;//doesn't go here
        }

    });
    //done after here
    return Success;
}

和服务:

[WebMethod]
public string SavePurpose(int Vid, int PurpId)
{
    try 
    {
        CHData.UpdatePurpose(Vid, PurpId);
        //List<IDName> abc = new List<IDName>();
        //abc.Add(new IDName { Name=1, value="Success" });
        return "Success";
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

正在从 AJAX 成功调用该服务。价值也在改变。但是在服务之后,success:error:函数没有被调用,在这种情况下,success 应该被调用但它不起作用。

我使用了firebug,发现成功或错误功能被跳过并直接转到return Success;

似乎找不到代码有什么问题。

更新: 添加async: false修复了问题

4

2 回答 2

29

将您的代码更改为:

function ChangePurpose(Vid, PurId) {
    var Success = false;
    $.ajax({
        type: "POST",
        url: "CHService.asmx/SavePurpose",
        dataType: "text",
        async: false,
        data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            Success = true;
        },
        error: function (textStatus, errorThrown) {
            Success = false;
        }
    });
    //done after here
    return Success;
} 

您只能从synchronous函数返回值。否则你将不得不制作一个callback.

所以我刚刚添加async:false,到您的 ajax 调用中

更新:

jquery ajax 调用默认是异步的。因此,当 ajax 加载完成时,将调用成功和错误函数。但是您的 return 语句将在 ajax 调用开始后立即执行。

更好的方法是:

     // callbackfn is the pointer to any function that needs to be called
     function ChangePurpose(Vid, PurId, callbackfn) {
        var Success = false;
        $.ajax({
            type: "POST",
            url: "CHService.asmx/SavePurpose",
            dataType: "text",
            data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                callbackfn(data)
            },
            error: function (textStatus, errorThrown) {
                callbackfn("Error getting the data")
            }
        });
     } 

     function Callback(data)
     {
        alert(data);
     }

并将ajax称为:

 // Callback is the callback-function that needs to be called when asynchronous call is complete
 ChangePurpose(Vid, PurId, Callback);
于 2013-01-23T09:12:56.127 回答
11

尝试将 ajax 调用封装到一个函数中,并将 async 选项设置为 false。请注意,此选项自 jQuery 1.8 起已弃用。

function foo() {
    var myajax = $.ajax({
        type: "POST",
        url: "CHService.asmx/SavePurpose",
        dataType: "text",
        data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
        contentType: "application/json; charset=utf-8",
        async: false, //add this
    });
    return myajax.responseText;
}

你也可以这样做:

$.ajax({
    type: "POST",
    url: "CHService.asmx/SavePurpose",
    dataType: "text",
    data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
    contentType: "application/json; charset=utf-8",
    async: false, //add this
}).done(function ( data ) {
        Success = true;
}).fail(function ( data ) {
       Success = false;
});

您可以阅读有关jqXHR jQuery 对象的更多信息

于 2013-01-23T09:17:25.793 回答