如何在request.execute到gapi.client.youtube完成后才能执行函数?

时间:2015-03-18 18:19:41

标签: javascript youtube-api

我正在尝试从youtube播放列表的多个页面获取结果。问题是我收到第二个请求(第二页)只有在收到第一个请求后才能执行。我已经尝试过承诺,推迟,回调,似乎没有任何工作。

function requestVideoPlaylist(playlistId, pageToken, pages) {
  $('#video-container').html('');
  var requestOptions = {
    playlistId: playlistId,
    part: 'snippet',
    maxResults: 10
  };
  if (typeof(pages)==='undefined') {
    pages = 2;
  }

  var i = 0
  while (i++ < pages){
    var request = gapi.client.youtube.playlistItems.list(requestOptions);
    request.execute(function(response) {

      nextPageToken = response.result.nextPageToken;

      var playlistItems = response.result.items;    
      console.log(playlistItems)

      if (playlistItems) {
        $.each(playlistItems, function(index, item) {
          displayResult(item.snippet);
        });
      } else {
        $('#video-container').html('Sorry you have no uploaded videos');
      }
    }).done(console.log('test'));

    if (nextPageToken) {
      console.log(nextPageToken)
      requestOptions.pageToken = nextPageToken;
    }
  }       
}

在这个示例中,我收到一条消息&#39; Uncaught TypeError:无法读取属性&#39;已完成&#39; .done(console.log(&#39; test))的未定义&#39; 以及 console.log(nextPageToken)中没有任何内容该部分也在收到回复之前执行。

1 个答案:

答案 0 :(得分:1)

显然request.execute()不返回任何内容(undefined),更不用说Promise了,所以将函数调用直接粘贴到回调中,如下所示:

request.execute(function(response) {
  nextPageToken = response.result.nextPageToken;

  var playlistItems = response.result.items;    
  console.log(playlistItems);

  if (playlistItems) {
    $.each(playlistItems, function(index, item) {
      displayResult(item.snippet);
    });

    loadNextPage(nextPageToken); // <--
  } else {
    $('#video-container').html('Sorry, you have no uploaded videos');
  }
});

顺便说一句,你不能做.done(console.log(...)),因为这相当于:

var foo = console.log(...);
getAPromise().done(foo);

fooconsole.log()返回的内容,在这种情况下是undefined,因此您正在调用.done(undefined),这显然不符合您的意思。相反,你需要做一些像guest271314建议的那样的事情:

getAPromise().done(function(arg) {
  console.log(arg);
});

(除了 之外,我建议你go read a JS book加强对这种典型模式的理解。)