当我从jsonServerResponse函数提醒返回的值时,它的值是未定义的 - 尽管从process.php页面返回了JSON。
function jsonServerResponse(operation, JSOoptionalData) {
JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
var jqxhr = $.ajax({
type: "POST",
url: "process.php",
data: "apicommand=" + JSOoptionalData,
success: function (json) {
return jQuery.parseJSON(json);
}
});
}
alert("Response as JS Object: "+jsonServerResponse("operation"));
我知道问题是异步请求完成之前发出的警报功能,但我不确定如何解决这个问题。任何建议都非常感谢:)
答案 0 :(得分:5)
这是因为AJAX请求是异步的,因此在调用完成之前命中return
,因此该函数始终返回null。
您需要在success
回调本身内调用依赖于AJAX调用的代码。试试这个:
function jsonServerResponse(operation, JSOoptionalData) {
JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
var jqxhr = $.ajax({
type: "POST",
url: "process.php",
data: "apicommand=" + JSOoptionalData,
success: function (json) {
alert("Response as JS Object: " + json);
// to see more information about the object returned, use console.log:
console.log(json);
}
});
}
jsonServerResponse("operation")
答案 1 :(得分:1)
你解决了这个问题,ajax是一个异步操作,你只能在成功回调中使用返回的数据:
function jsonServerResponse(operation, JSOoptionalData) {
// What that line suppose to do???
JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
var jqxhr = $.ajax({
type: "POST",
url: "process.php",
data: "apicommand=" + JSOoptionalData,
dataType: "json", // Change the dataType to json.
success: function (json) {
console.log("Response as JS Object:")
console.log(json);
}
});
}
答案 2 :(得分:1)
好的,我从另一个帖子中找到了它。结果可以在成功回调中处理,也可以添加一个本身就是回调函数的参数,并将ajax请求的结果应用于回调。
function jsonServerResponse(operation, callback, JSOoptionalData) {
JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
jqxhr = $.ajax({
type: "POST",
contentType: "application/json",
url: "process.php",
data: "apicommand=" + operation + "&optionaldata" + JSON.stringify(JSOoptionalData),
dataType: "json",
success: function (json) {
if(typeof callback === 'function') callback.apply(this, [json]);
}
});
}
jsonServerResponse("get_something_from_server", function(returnedJSO){
console.log(returnedJSO.Result.Some_data);
}, "optional_data");
gdoron,你问的那条线使第三个参数成为可选的。我听说这是一个很好的做法,如果你要将一些数据传递到服务器上(但你不知道有多少变量)来添加一个可选参数并只传递一个js对象,将其转换为一个JSON字符串,然后将其解码为服务器 - 侧。
和平! :)