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

Javascript 如何访问此ajax请求的返回值?,javascript,jquery,ajax,namespaces,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) {

我有这个密码

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”,这是为什么

如何返回
数据
变量


我尝试执行
return$.ajax({
但这只是返回函数代码。

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



我想从jquery站点链接一些解释,但它现在似乎已关闭。

您将无法处理从
成功
回调返回的返回值,原因如下:

  • 首先,您的
    returndata
    语句是从
    success
    回调返回的,而不是从外部
    GetMetaData
    函数返回的

  • 但是另外,当调用
    成功
    回调时,
    GetMetaData
    函数将已经返回。请记住,
    $.ajax()
    默认为异步(非阻塞)。异步是中的A


您应该直接在回调中处理响应
数据
,或者调用一个helper函数来处理响应。因为函数是JavaScript中的头等公民,所以您可以传递这个“helper函数”作为
GetMetaData
函数的参数,as.

由于请求将是异步的,因此访问数据的方法是通过回调函数,在本例中,回调函数是分配给
success
属性的函数。您可以使请求同步,但这是一个阻塞调用,我不建议将其作为br在请求返回之前,owser一直处于锁定状态。

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

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;
    }
}
您可以使调用同步,但如果可能,您应该避免这种情况,因为它会在响应到达之前冻结浏览器。通常的方法是使用回调函数

向方法添加回调:

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
});

在success函数中,调用将处理数据的javascript函数,即:

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

        ...

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

您的问题是AJAX调用是异步的,因此在GetMetaData函数退出后的一段时间内,当远程服务器返回数据时,才会调用“success”。您可以选择同步并等待响应,但最好使用如上所述的回调函数。

对良好的answ进行小的补充呃;同步请求将锁定您的浏览器,直到它完成。这对用户体验没有帮助;)在这种情况下,在请求完成之前,实际上不允许发生任何事情,因为整个扩展需要数据(它包含图像URL等)。因此,强制将其同步非常有用。此外,我如何处理回调函数,因为该函数将在所有地方使用以获取数据,并且它是所需的响应对象。(我知道有人会说缓存它,我是,但有几种类似的函数。)@Hailwood:强制同步从来都不是(让我们说很少)在浏览器脚本编写中有用。如果服务器需要2秒的响应时间,web界面将冻结2秒。请记住,JavaScript与页面呈现共享同一个线程。阻塞(同步)操作,如长的
循环,而
循环会冻结浏览器。@Hailwood-强制它同步很有用,缺点是如果请求从未完成,浏览器将保持锁定状态。