当async为true时,Ajax调用返回undefined

Ajax Call returns undefined when async is true

本文关键字:Ajax 调用 返回 undefined async true      更新时间:2023-09-26

有函数,当async为false时它可以工作,但我想要相同的功能(我指的是返回值),但async为true。

  function Call(param, proc) {
    var url = "../../DataManager/DataManagment.aspx/DataSelector";
    var ret;
    $.ajax({
        url: url,
        type: "POST",
        datatype: "json",
        data: JSON.stringify({
            "data": param,
            "action": proc
        }),
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            ret = data;
        },
        async: false,
        error: errorFn
    });
    return ret.d;
}

执行以下操作:

 function callServerAsync(){
   $.ajax({
        url: '...',
        success: function(response) {
            successCallback(response);
        }
    });
  }
  function successCallback(responseObj){
     alert(JSON.stringify(responseObj)); // Only applicable to JSON response
   }

对于async=true;退货声明不符合您的目的。相反,进行如下回调:

function Call(param, proc, callBackFunc) {
    var url = "../../DataManager/DataManagment.aspx/DataSelector";
    var ret;
    $.ajax({
        url: url,
        type: "POST",
        datatype: "json",
        data: JSON.stringify({
            "data": param,
            "action": proc
        }),
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            ret = data;
            if(typeof callBackFunc == 'function')
            {
                callBackFunc(ret.d);
            }
        },
        async: true,
        error: errorFn
    });
}

并将您的函数称为:

function myCallBackFunc(obj)
{
    alert(obj);
}
//call the actual function like:
Call(param, proc,myCallBackFunc);

mate,您的问题是:返回ret.d;

您应该让您返回ret.d;在success函数中,否则,无论您的ajax是否成功,return ret.d都会立即返回,这就是为什么当您强制ajax运行sync时,它是有效的,但当async时却不起作用,因为时间ret只定义了,但没有赋值,请检查:

function Call(param, proc) {
var url = "../../DataManager/DataManagment.aspx/DataSelector";
var ret;
$.ajax({
url: url,
type: "POST",
datatype: "json",
data: JSON.stringify({
    "data": param,
    "action": proc
}),
contentType: "application/json; charset=utf-8",
success: function (data) {
    ret = data;
    return ret.d;
},
async: true,
error: errorFn
});
}

您不能从像AJAX这样的异步代码返回。相反,你需要重新考虑一下你的功能。

因此,您要么需要使用回调并在成功函数中调用它,要么最好只返回promise对象:

function Call(param, proc) {
    var url = "../../DataManager/DataManagment.aspx/DataSelector";
    return $.ajax({
        url: url,
        type: "POST",
        datatype: "json",
        data: JSON.stringify({
            data: param,
            action: proc
        }),
        contentType: "application/json; charset=utf-8",
        error: errorFn
    });
}
Call(params, process).then(function(data) {
    console.log(data);
});