我试图让一个函数从另一个页面上的php文件中获取一个对象。我正在使用jQuery ajax函数来执行json抓取,这是正常工作。问题是当我尝试从函数返回该对象时。
我第一次记录对象(在成功函数中)在控制台中是正确的,但函数getGantt()返回的对象记录为“未定义”。
如何从函数中获取此对象?
我的代码:
function getGantt(requestNumber){
var ganttObject;
$.ajax({
type: "POST",
url: "get_gantt.php",
data: {request_number: requestNumber},
success: function(returnValue){
ganttObject = $.parseJSON(returnValue);
console.log(ganttObject); //this logs a correct object in the console
}
});
return ganttObject;
}
$(function(){ //document ready function
var requestNumber = $('#request_number').text();
var ganttObject = getGantt(requestNumber);
console.log(ganttObject); //this logs "undefined"
}); //end document ready function
答案 0 :(得分:7)
Ajax中的A是首字母缩略词的重要组成部分。异步JavaScript和XML是异步的。
$.ajax({success:someFunction})
表示发出HTTP请求,当响应到达时,运行someFunction
return ganttObject
在响应到达之前运行。
您应该对内部 someFunction
中的数据执行任何操作,而不是尝试将数据返回到调用函数。
答案 1 :(得分:1)
AJAX中的A代表异步。所以调用立即返回,一旦完成,就会调用成功回调。
因此,只需更改代码即可使用回调:
function getGantt(requestNumber, callback) {
var ganttObject;
$.ajax({
type: "POST",
dataType: 'json',
url: "get_gantt.php",
data: {request_number: requestNumber},
success: function(returnValue){
callback(returnValue);
}
});
}
$(function() {
var requestNumber = $('#request_number').text();
var ganttObject = getGantt(requestNumber, function(ganttObject) {
console.log(ganttObject);
});
});
顺便说一句,我还删除了这个parseJSON的东西 - 将dataType设置为json可以完成工作并且不那么脏。
答案 2 :(得分:0)
我知道为什么它至少没有归还它。 ganttObject可能在同一范围内,但success函数最终在XMLHTTP对象的readyState回调中运行,因此它与getGantt函数位于不同的线程上。你可以将$(function(){...代码分开你的成功函数吗?