如何访问此ajax请求的返回值?

时间:2010-09-30 09:38:19

标签: javascript jquery ajax namespaces

我有这段代码

var stats =  {
    GetMetaData : function() {
        var url = 'http://www.bungie.net/api/reach/reachapijson.svc/game/metadata/'+storage.get('apikey');
        $.ajax({
            url: url,
            success: function(data) {
                return data;
            }
        });
        return 'abc';
    }
}

我使用stats.GetMetaData();

调用该函数

我希望返回的值是ajax请求中的data变量。 但是它是字符串'abc'为什么会这样?

如何返回data变量?

我尝试了return $.ajax({,但只返回功能代码。

6 个答案:

答案 0 :(得分:4)

因为jquery ajax请求默认是异步的。您可以使用async: false选项或(更好)使用回调函数来使请求同步 此外,正如 CharlesLeaf 所述,使用同步请求会锁定浏览器,直到收到回复。

About the whole concept of asynchronous operations.
我会从jquery网站链接一些解释,但它现在似乎已经失效了。

答案 1 :(得分:1)

由于以下原因,您将无法处理从success回调中返回的返回值:

  • 首先,您的return data语句正在从success回调中返回,而不是从外部GetMetaData函数返回。

  • 但此外,在调用success回调时,GetMetaData函数已经返回。请记住,默认情况下$.ajax()是异步(非阻塞)。异步是AJAX中的 A

您应该直接处理回调中的响应data,或者调用辅助函数来处理响应。由于函数是JavaScript中的一等公民,因此您可以将此“帮助函数”作为GetMetaData函数的参数传递给@Guffa suggested in the other answer

答案 2 :(得分:1)

var stats =  {
    GetMetaData : function() {
        var url = 'http://www.bungie.net/api/reach/reachapijson.svc/game/metadata/'+storage.get('apikey');
        var result;
        $.ajax({
            url: url,
            async: false,
            success: function(data) {
                result = data;
            }
        });

        return result;
    }
}

答案 3 :(得分:1)

AJAX调用是异步的,这意味着调用立即返回,并在数据到达时调用回调函数。由于您的GetMetaData方法已经完成,因此将忽略回调返回的值。

您可以同步拨打电话,但如果可能,您应该避免这种情况,因为它冻结浏览器直到响应到达。通常的方法是使用回调函数。

为方法添加回调:

var stats =  {
  GetMetaData : function(callback) {
    var url = 'http://www.bungie.net/api/reach/reachapijson.svc/game/metadata/'+storage.get('apikey');
    $.ajax({
        url: url,
        success: callback
    });
  }
}

使用以下方式调用:

stats.GetMetaData(function(data){
  // do something with the data
});

答案 4 :(得分:0)

由于请求将是异步的,因此访问数据的方式是通过回调函数,在这种情况下,函数是分配给success属性的函数。您可以使请求同步,但这是一个阻塞调用,我不建议这样做,因为浏览器在请求返回之前被锁定。

答案 5 :(得分:0)

在你的成功函数中调用你将处理数据的javascript函数,即:

        success: function(data) {
            DoSomthingWithThe(data);
        }

        ...

    function DoSomethingWithThe(data) {
       // Do something useful
    }

你的问题是AJAX调用是异步的,所以直到你的GetMetaData函数退出后,远程服务器返回数据时,才会调用'success'。您可以选择同步并等待响应,但如上所示使用回调函数要好得多。