我是AJAX的新手,我需要找到一种方法将AJAX JSON响应返回给调用函数。有没有办法实现这一目标。 我的代码片段:
Python 2.7.10 (default, May 23 2015, 09:44:00)
[MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, os, msvcrt, ctypes
>>> ctypes.cdll.msvcr90.wprintf(b'w\x00i\x00d\x00e\x00\n\x00')
wide
5
>>> msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
16384
>>> ctypes.cdll.msvcr90.wprintf(b'w\x00i\x00d\x00e\x00\n\x00')
w i d e
5
答案 0 :(得分:1)
jQuery.ajax()
performs asynchronous HTTP request。因此,您无法同步返回其响应(您的代码正在尝试这样做)。
如果请求成功,success(data, textStatus, jqXHR)
处理程序将在某个时刻被调用(您不知道何时)。
以下是修改代码的一种方法:
function requestAjaxWebService(webServiceName, method, jsonData, callback) {
$.ajax({
url: webServiceName,
type: method,
data : jsonData,
dataType: "json",
success: function (data, textStatus, jqXHR) {
callback(true, data); // some method that knows what to do with the data
},
error: function(jqXHR, textStatus, errorThrown){
callback(false, errorThrown);
}
});
}
callback
应该是对以下方法的引用:
function onData(isSuccess, dataOrError)
{
if (isSuccess) {
// do something with data
} else {
console.error(dataOrError);
}
}
更新如果由于某种原因在回调中需要设置对象:
function onData(isSuccess, settings, jqXHR, errorThrown)
{
if (isSuccess) {
// do something with the data:
// jqXHR.responseText or jqXHR.responseXML
} else {
// do something with error data:
// errorThrown, jqXHR.status, jqXHR.statusText, jqXHR.statusCode()
}
}
function requestAjaxWebService(webServiceName, method, jsonData, callback) {
var settings = {
url: webServiceName,
type: method,
data : jsonData,
dataType: "json"
};
settings.success = function(data, textStatus, jqXHR){
callback(true, settings, jqXHR);
};
settings.error = function(jqXHR, textStatus, errorThrown){
callback(false, settings, jqXHR, errorThrown);
};
$.ajax(settings);
}
requestAjaxWebService("name", "POST", "json", onData);
你也可以使用jqxhr对象的.done()
和.fail()
回调代替settings
对象中的回调,正如obiTheOne的答案所暗示的那样。它可能看起来更整洁,但在这里并不重要。
答案 1 :(得分:1)
jQuery.ajax是一个异步函数,所以通常它不会返回任何内容。
无论如何,您可以通过将async选项设置为false来将值返回到原始函数,但不建议这样做,因为同步请求将阻止其余代码的其余执行,直到返回响应为止。
function requestAjaxWebService(webServiceName, method, onSuccess, onFail) {
var returnData;
$.ajax({
url: webServiceName,
type: method,
async: false,
data : jsonData,
dataType: "json",
success: function (data) {
returnData = data;
},
error: function(error){
returnData = "Server error";
}
});
}
看一下这个例子:jsbin sync ajax example
您应该使用回调(标准方式)来处理响应
function onSuccess (data) {
console.log(data);
}
function onFail (error) {
console.log('something went wrong');
}
function requestAjaxWebService(webServiceName, method, onSuccess, onFail) {
$.ajax({
url: webServiceName,
type: method,
data : jsonData,
dataType: "json",
success: onSuccess,
error: onError
});
}
或者你可以返回一个Promise(一种异步对象),它会在请求完成后立即改变值
function requestPromise (webServiceName, method) {
return $.ajax({
url: webServiceName,
type: method,
data : jsonData,
dataType: "json"
});
}
requestPromise('...', 'GET').done(function (data) {
console.log(data);
});
参考文献: jquery.ajax params