开发者

$.getJSON only returns partial and an empty array

I am creating an object to handle the YouTube API and I have two methods:

  • getCommentList - getting a url for the current upload,for example http://gdata.youtube.com/feeds/api/videos/VIDEO_ID/comments?alt=json and return an array of objects - author of the comment and the content of the comment.
  • getEntriesObject - returning an array with objects for each upload entry we have title,thumbnail,and the comment list that returned from getCommentList

My jQuery code:

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 = {},
      开发者_StackOverflow社区    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
   */
};

I have console.log(currentObject) and am getting the title. But am not getting the thumbnail URL and the comments.

In addition, when I run getEntriesObject I get back an empty array.


When you call return in the callback to $.getJSON you are returning only that callback function, not the "outer" getCommentObject. Thus when you later call that.getCommentObject you're not getting anything in return (undefined).

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

      // Snip ...

      $.getJSON(url,function(data){

         // Snip ...

         return commentsList; // <- Here
      });

   }
}

To amend this make getCommentObject take a callback function.

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

      // Snip ...

      $.getJSON(url,function(data){

         // Snip

         // Remove the return statement
         callback(commentsList);
      });

   }
}

Call this function like this:

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

Replacing

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


You are getting the empty comments because the return statement is in the wrong place. It is in the getJSON callback function. You need to move it from line no 19 to 21 so that it becomes the return statement for getCommentObject. This will fix the first problem. (comments undefined)

Second getEntriesObject is empty because, for some users youtube is returning "Service Unavailable" error for the json request. This happened for when I tried with some random username on youtube.

I checked your program with youtube username "google". After changing the return statement it worked fine.

Hope this helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜