如何创建一个从AJAX返回数据的JavaScript函数?

时间:2013-01-19 17:51:01

标签: javascript jquery

  

可能重复:
  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。:我不知道也许我只是在节目中非常紧张,为什么我不能正确行事。 -_-“

3 个答案:

答案 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。您可以将$.ajaxasync: false一起使用,但它将被弃用。您可以做的最好的事情是return $.post(...),然后在结果上使用.done(...)来使用响应。

答案 2 :(得分:0)

Ajax调用是异步的,因此您可以在获取数据之前使用它们。考虑使用deffered对象。 http://api.jquery.com/category/deferred-object/