返回数据后阿贾克斯是行不通的
问题描述:
我想检索数据使用$ .post并将其存储为返回类型。但是,我总是收到一个未定义的错误。返回数据后阿贾克斯是行不通的
,如果我这样做:
function get_list(){
$.post('php/reverse.php', function(data){
alert(data);
});
}
一切完美。但如果我做类似
function get_list(){
$.post('php/reverse.php', function(data){
return data;
});
}
alert(get_list());
然后它突然给我一个未定义的错误。有人能告诉我我做错了什么吗?
答
你不能在异步情况下返回这样的数据...
你必须通过它的成功执行了一些回调:
function get_image_list(handler){
$.post('php/reverse.php', function(data){
handler(data);
});
}
get_image_list(function(data){alert(data);});
+0
太好了!工作非常好! – kuwame 2013-04-11 21:19:08
答
这是因为asynchronous
性质AJAX的。您不能从回调函数返回值,因为在AJAX调用触发回调时,所有其他代码都已执行很长时间。
答
您的get_image_list实际上并不返回任何内容,因为它不包含return语句。 AJAX调用是异步执行的。对于按预期的方式工作,你的代码片段,那就要看起来像:
function get_image_list(callback) {
$.post('php/reverse.php', function(data){
callback(data);
});
}
get_image_list(function(data) { alert(data); });
答
这不是理想的,但似乎你不熟悉异步调用呢。请调查回调。 说了这么多,这是你要寻找的代码:
function getList(){
var dataToReturn;
$.ajax({
url: "php/reverse.php",
async: false
}).done(function(data){
dataToReturn = data;
});
return dataToReturn;
}
alert(getList());
通过设置异步为假,你迫使代码要等到数据是随时可以使用。这样你就可以分配给'dataToReturn',并在函数执行结束时返回它。默认情况下,异步是真实的,所以在数据准备好之前执行到达函数的末尾,因此没有什么可以返回的。
考虑范围。你告诉你的匿名函数返回数据,但包含这个post调用的函数什么都不返回。 – 2013-04-11 21:14:49
那我该如何解决呢? – kuwame 2013-04-11 21:15:07
考虑到'get_list'函数在匿名回调函数开始执行之前返回。 'get_list'函数返回undefined,因为它在执行过程中从不碰到'return'语句。 'return data'语句位于回调函数内部,不会作为'get_list'函数的一部分执行。回调函数在异步POST请求完成后执行(但调用它的代码不关心它返回的内容)。 – tcovo 2013-04-11 21:21:27