我有这段代码
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({
,但只返回功能代码。
答案 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'。您可以选择同步并等待响应,但如上所示使用回调函数要好得多。