【问题标题】:$.getJson> $.each returns undefined$.getJson> $.each 返回未定义
【发布时间】:2010-03-17 20:02:51
【问题描述】:
function getData(d){
Back = new Object();

$.getJSON('../do.php?',
   function(response){    
    if(response.type == 'success'){ 
    Back = { "type" : "success", "content" : "" };
    $.each(response.data, function(data){   
       Back.content +='<div class="article"><h5>'+data.title+'</h5>'
       Back.content +='<div class="article-content">'+data.content+'</div></div>';
      });

    }
    else{
     Back = {"type" : "error" };
    }

    return Back;
  });
}

console.log(getData()); 

返回未定义!为什么?

【问题讨论】:

    标签: jquery


    【解决方案1】:

    您不能以同步方式调用异步函数。在您的代码中,这是:

    function(response){    
        if(response.type == 'success'){ 
        Back = { "type" : "success", "content" : "" };
        $.each(response.data, function(data){   
           Back.content +='<div class="article"><h5>'+data.title+'</h5>'
           Back.content +='<div class="article-content">'+data.content+'</div></div>';
          });
    
        }
        else{
         Back = {"type" : "error" };
        }    
        return Back;
    }
    

    在此之后运行:console.log(getData());

    $.getJSON 中的回调(第二个参数)在服务器返回响应后运行,这不会立即发生。

    如果你在实际运行时调用日志记录,你会得到预期的结果:

    Back = new Object();
    $.getJSON('../do.php?', function(response) {    
      if(response.type == 'success') { 
        Back = { "type" : "success", "content" : "" };
        $.each(response.data, function(data) {   
          Back.content +='<div class="article"><h5>'+data.title+'</h5>';
          Back.content +='<div class="article-content">'+data.content+'</div></div>';
        });
      } else {
        Back = {"type" : "error" };
      }
      console.log(Back); 
    });
    

    【讨论】:

    • 好吧,他可以通过添加 $.ajaxSetup({async:false}); 使其同步在 getData 函数的最开始,它应该可以正常工作。
    • @Bob - 好点...但我还没有遇到过您想要这样锁定浏览器的情况,尽管我确定它存在。
    【解决方案2】:
    Back = new Object();
    
    $.ajax({
        type: "GET",
        async: false,
        url: "../do.php",
        dataType: 'json',
        success: function(response){
            if(response.type == 'success'){ 
                Back = { "type" : "success", "content" : "" };
                $.each(response.data, function(data){           
                            Back.content +='<div class="article"><h5>'+data.title+'</h5><div class="article-image"><img src="'+data.image+'" alt="article_image" /></div>'
                            Back.content +='<div class="article-content">'+data.content+'</div><br class="clear" /></div><!-- /article -->';
                        });
    
                }
                else{
                    Back = {"type" : "error" };
                }
    
                return Back;
        }});
    

    应该这样工作吗?

    【讨论】:

    • 这种方式需要把return放在$.ajax外面或者在$.ajax调用后直接访问Back,只用success函数设置,不return它。
    猜你喜欢
    • 2010-11-29
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多