代码之家  ›  专栏  ›  技术社区  ›  Yosi

$.getjson只返回部分数组和空数组

  •  1
  • Yosi  · 技术社区  · 14 年前

    我正在创建一个对象来处理YouTube API,我有两种方法:

    • getCommentList -例如,获取当前上载的URL http://gdata.youtube.com/feeds/api/videos/VIDEO_ID/comments?alt=json 并返回一个对象数组-注释的作者和注释的内容。
    • getEntriesObject -返回一个数组,其中包含每个上载条目的对象,我们有标题、缩略图和从中返回的注释列表。 获取注释列表

    我的jQuery代码:

    var Youtube = {
    
       getCommentObject : function(url){
          if( url ){
             var currentCommentFeed = {},
                 commentsList = [];
    
             $.getJSON(url,function(data){
                $.each(data.feed.entry,function(index){
                   currentCommentFeed = this;
    
                   commentsList.push({
                      author : currentCommentFeed.author[0].name.$t,
                      content : currentCommentFeed.content.$t
                   });
    
                });
    
                return commentsList;
             });
    
          }
       },
    
       getEntriesObject : function(){
          var username = 'SOMEYOUTUBEUSERHERE',
              url = 'http://gdata.youtube.com/feeds/api/users/' + username + '/uploads?alt=json',
              currentEntry = {},
              currentObject = {},
              entryList = [];
    
          // Scope fix
          var that = this;
    
          $.getJSON(url,function(data){
             $.each(data.feed.entry, function(index){
    
                // Caching our entry
                currentEntry = this;
    
                // Adding our entry title and thumbnail
                currentObject = {
                   title: currentEntry.title.$t
                };
    
                if(currentEntry.media$group.media$thumbnail.length == 4)
                   currentObject['thumbnail'] = currentEntry.media$group.media$thumbnail[3].url;
    
                // Let`s get the comments - undefined....
                currentObject['comments'] = that.getCommentObject(currentEntry.gd$comments.gd$feedLink.href + "?alt=json");
    
                console.log(currentObject);
                entryList.push(currentObject);
             });
          });
    
          return entryList;
    
       }
    
       /*
    
       entry[i].title.$t
       entry[i].gd$comments.gd$feedLink.href + "?alt=json"
       entry[i].media$group.media$thumbnail[3]
    
       // Comments 
       entry[i].author.name.$t
       entry[i].author.content.$t
       */
    };
    

    我有 console.log(currentObject) 我得到了头衔。但我没有得到缩略图的网址和评论。

    另外,当我跑步时 GetEntriesObject 我得到一个空数组。

    2 回复  |  直到 12 年前
        1
  •  3
  •   ase    14 年前

    当您在回拨时返回到 $.getJSON 您只返回回调函数,而不返回“外部” getCommentObject . 所以当你稍后打电话时 that.getCommentObject 你得不到任何回报( undefined )

    getCommentObject: function(url){
       if( url ){
    
          // Snip ...
    
          $.getJSON(url,function(data){
    
             // Snip ...
    
             return commentsList; // <- Here
          });
    
       }
    }
    

    修改这个牌子 获取命令对象 接受回调函数。

    getCommentObject: function(url, callback){
       if( url ){
    
          // Snip ...
    
          $.getJSON(url,function(data){
    
             // Snip
    
             // Remove the return statement
             callback(commentsList);
          });
    
       }
    }
    

    这样调用此函数:

    that.getCommentObject(
        currentEntry.gd$comments.gd$feedLink.href + "?alt=json", 
        function (commentsList) { 
           currentObject['comments'] = commentsList; 
    });
    

    替代

    currentObject['comments'] = that.getCommentObject(currentEntry.gd$comments.gd$feedLink.href + "?alt=json");
    
        2
  •  1
  •   Uttam    14 年前

    您得到的是空注释,因为返回语句的位置不正确。它在getjson回调函数中。您需要将它从第19行移动到第21行,以便它成为getcommentobject的返回语句。这将解决第一个问题。(未定义注释)

    第二个getEntriesObject是空的,因为对于某些用户,YouTube会为JSON请求返回“服务不可用”错误。这是因为我在YouTube上尝试了一些随机用户名。

    我用youtube用户名“google”检查了你的程序。在更改了返回声明之后,它工作得很好。

    希望这有帮助。