可能重复:
How to return the response from an AJAX call from a function?
我已尝试在Google Chrome的开发者控制台中进行调试,但无论如何我都无法获得我想要的结果。我想创建一个javascript函数,它将通过AJAX从外部文件返回一个值。我试过这个剧本:
var site = {
token: function(){
$.get('auth.php',function(data){
return data;
});
}
};
...当我调用site.token()
函数时,它应该从 auth.php 返回获取的内容。但事实并非如此。它总是undefined
。我也试过这个:
var site = {
token: function(){
var token = null;
$.get('auth.php',function(data){
token = data;
});
return token;
}
};
但它仍然是一样的。我也找到了解决方法:
var token = $.get('auth.php',function(data){
return data;
});
token.responseText;
有了这些代码,我现在可以得到我预期的结果。但是当我把它放在一个函数中时:
var site = {
token: function(){
var token = $.get('auth.php',function(data){
return data;
});
return token.responseText;
}
};
......它再次失败。
* P.S。:我不知道也许我只是在节目中非常紧张,为什么我不能正确行事。 -_-“
答案 0 :(得分:2)
$.post()
是$.ajax()
的简写,两者都是异步的(除非你做的很糟糕)。您不希望在对php页面的请求期间冻结浏览器的GUI线程。因此site.token()
无法回复数据。
但是,$.ajax()
确实会返回一个承诺(请参阅http://www.erichynds.com/jquery/using-deferreds-in-jquery/和how does jquery's promise method really work?)。从本质上讲,它说:“我保证,当我完成时,我会给你回电话。”所以,你可以像这样构建类:
var site = {
token: function(){
var promise = $.get('auth.php',function(data){
return data;
});
return promise;
}
};
并将其称为:
var promise = site.token();
promise.done(function (data) {
alert('got the data');
console.dir(data);
});
答案 1 :(得分:1)
如果这是可能的,那么可以放弃函数构思,语法可以是:
var data = $.post("url");
然而,这是不可能的,因为AJAX是异步的。收到回复需要一段时间。在这种情况下,您的函数被调用。这就是传递函数的想法。
无法使此同步以便使用return
。您可以将$.ajax
与async: false
一起使用,但它将被弃用。您可以做的最好的事情是return $.post(...)
,然后在结果上使用.done(...)
来使用响应。
答案 2 :(得分:0)
Ajax调用是异步的,因此您可以在获取数据之前使用它们。考虑使用deffered对象。 http://api.jquery.com/category/deferred-object/