我确定你知道这个问题,我仍然试图解决它几天。我尝试了很多东西,但没有人工作:
这是代码
function lobbyLeader() {
$.ajax({
data: {"id": 1, "request": "lobbyinfo", "method": "read"},
url: 'api.php',
dataType: 'json',
success: function(data){
result = data.leader;
return result;
}
});
}
alert(result);
会显示1
,但在其他功能中使用时会显示undefined
。
答案 0 :(得分:11)
你不能从这样的异步函数return
,你从那个success
回调函数返回,而不是父函数。相反,在回调中启动您需要的任何内容,如下所示:
function lobbyLeader() {
$.ajax({
data: {"id": 1, "request": "lobbyinfo", "method": "read"},
url: 'api.php',
dataType: 'json',
success: function(data){
someOtherFunc(data.leader);
}
});
}
答案 1 :(得分:4)
这里的问题是AJAX是异步的(它是第一个A代表的)。这意味着函数立即返回;只有在请求成功时才会调用success
处理程序。这意味着lobbyLeader
在您提出请求后立即返回,因此不返回任何内容。
如果您有任何代码需要在收到数据后运行,则必须将其放在success
处理程序(或another AJAX event handler)中或由其调用。
答案 2 :(得分:3)
正确地说,你不能真正从成功回来,但是,如果你正在做我认为你正在做的事情,那就是抓住数据并将其归还给另一个地区IE中的某些东西
var obj = lobbyLeader();
然后你可以将函数设置为async:false并在代码运行完毕后将obj返回到Success之外。 示例
function lobbyLeader() {
var obj;
$.ajax({
async:false;
data: {"id": 1, "request": "lobbyinfo", "method": "read"},
url: 'api.php',
dataType: 'json',
success: function(data){
obj= JSON.parse(data);
}
});
return obj;
}
这样脚本停止等待成功,然后设置并返回。
答案 3 :(得分:2)
我推荐这种方式。
示例:
function makeJQGridDataFromList(url)
{
var rowData;
var viewPage = 0;
var viewTotal = 0;
var viewRecords = 0;
var resultObject;
$.ajax({
type:"GET",
url:url,
async: false,
success:function(args){
if(args.result==true)
{
try
{
viewPage = args.cond.pageIndex;
viewTotal = args.cond.recordCountPerPage;
viewRecords = args.cond.totalCnt;
rowData = jsonMakeRowsForGrid(args.data);
}
catch (e)
{
console.debug("Error!");
alert("Invalid data");
return;
}
} else
{
alert("API return ERROR!");
return;
}
},
error:function(e){
alert("Fail AJAX communication");
return;
}
});
resultObject = {
page : viewPage,
total : viewTotal,
records : viewRecords,
rows : rowData
};
return(resultObject);
}
您可以测试以下方法。
(在另一个文件(html或js)中)
var gridData = makeJQGridDataFromList(openAPIUrl);
console.debug(">> " + JSON.stringify(gridData));
你可以看到gridData。
我遇到了同样的问题。 :)
答案 4 :(得分:1)
当您从异步执行的匿名函数中return
值时,这些值不会传播范围链,return
语句仅应用于当前函数范围,而不是周围scope $.ajax()
是异步的,所以在执行语句后,外部函数会立即返回,因此外部函数没有返回值,这就是你获得undefined
的原因。
从传递给$.ajax
的回调函数挂钩到可能的返回值的唯一方法是调用另一个外部函数,传入所需的数据。