$ .getJSON只返回partial和一个空数组

时间:2010-09-21 17:12:37

标签: javascript jquery ajax youtube-api

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

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

我的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 个答案:

答案 0 :(得分:3)

当您在回调函数中调用return $.getJSON时,您只返回该回调函数,而不是“外部”getCommentObject。因此,当您稍后致电that.getCommentObject时,您无法获得任何回报(undefined)。

getCommentObject: function(url){
   if( url ){

      // Snip ...

      $.getJSON(url,function(data){

         // Snip ...

         return commentsList; // <- Here
      });

   }
}

要修改此make getCommentObject,请使用回调函数。

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");

答案 1 :(得分:1)

您收到空注释,因为return语句位于错误的位置。它位于getJSON回调函数中。您需要将它从第19行移动到21,以便它成为getCommentObject的return语句。这将解决第一个问题。 (评论未定义)

第二个getEntriesObject为空,因为对于某些用户,youtube正在为json请求返回“Service Unavailable”错误。当我在youtube上尝试使用一些随机用户名时,就会发生这种情况。

我使用youtube用户名“google”检查了您的程序。更改返回语句后,它工作正常。

希望这有帮助。