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

我有这个代码

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();调用该函数stats.GetMetaData();

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

如何返回data变量?

我尝试return $.ajax({但只返回function代码。

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

关于异步操作的整个概念。
我会从jquery网站链接一些解释,但它现在似乎已经失效了。

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

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

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

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

您应该直接处理回调中的响应data ,或者调用辅助函数来处理响应。 由于函数是JavaScript中的一等公民,因此您可以将此“帮助函数”作为参数传递给GetMetaData函数,正如@Guffa在另一个答案中所建议的那样 。

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

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

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

  success: function(data) { DoSomthingWithThe(data); } ... function DoSomethingWithThe(data) { // Do something useful } 

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