当async为true时,Ajax Call返回undefined

有exception是错误的function和它工作,但我想要相同的function(我的意思是返回值),但async是真的。

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; } 

您无法从AJAX等异步代码返回 。 相反,你需要重新考虑你的function。

所以你要么需要使用回调并在成功函数中调用它,要么更好地返回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); }); 

做类似的事情:

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

伙计,你的问题是:return ret.d;

你应该让你返回ret.d; 在success函数里面,否则,返回ret.d会立即返回无论你ajax是否成功,这就是为什么当你强制ajax运行同步它工作时,但不是异步因为那个时间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 }); } 

对于async = true; return语句不符合您的目的。 而是去做一些回调如下:

 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称为:

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