jquery ajax return:undefined

时间:2011-01-02 20:10:51

标签: jquery

我确定你知道这个问题,我仍然试图解决它几天。我尝试了很多东西,但没有人工作:

这是代码

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

5 个答案:

答案 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)

我推荐这种方式。

  1. 使用async:false。
  2. 的ajax调用
  3. 在ajax调用之后移动return语句。
  4. 示例:

    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的回调函数挂钩到可能的返回值的唯一方法是调用另一个外部函数,传入所需的数据。