1

可能重复:
如何从函数的 AJAX 调用返回响应?

我曾尝试在 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;
    }
};

...它再次失败。

*PS:我不知道也许我只是在编程中真的很紧张,为什么我不能把它做好。-_-”

4

3 回答 3

2

$.post()是 的简写$.ajax(),两者都是异步的(除非你做了非常糟糕的事情)。您不想在对 php 页面的请求期间冻结浏览器的 GUI 线程。因此site.token()无法用数据回复。

但是,$.ajax()确实返回了一个承诺(请参阅http://www.erichynds.com/jquery/using-deferreds-in-jquery/以及jquery 的 promise 方法如何真正起作用?)。本质上,它说的是“我保证我完成后会给你回电话。” 因此,您可以像这样构造类:

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);
});
于 2013-01-19T18:02:16.390 回答
1

如果这是可能的,那么函数的想法可以被丢弃,语法可以是:

var data = $.post("url");

然而这是不可能的,因为 AJAX 是异步的。在收到响应之前需要一段时间。在这种情况下,将调用您的函数。这就是传递函数的想法。

没有办法使这个同步以便使用return. 你可以使用$.ajaxwithasync: false但它会被弃用。您可以做的最好的事情是return $.post(...)然后使用.done(...)结果来使用响应。

于 2013-01-19T17:54:47.547 回答
0

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

于 2013-01-19T17:59:00.563 回答