如何访问此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函数退出后,远程服务器返回数据后,才会调用“成功”。 您可以选择同步并等待响应,但使用如上所示的回调函数要好得多。