如何仅在完成对gap.client.youtube的请求.execute后执行函数



我正试图从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;
    }
  }       
}

在本例中,我收到一条消息'Uncaught TypeError:无法读取.done(console.log('test))的未定义'属性'done',并且没有从console.log(nextPageToken)中读取任何内容,因为该部分也在收到响应之前执行。

显然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);
});

(除了之外,我建议你去读一本JS书,以加强你对这类典型模式的理解。)

相关内容

  • 没有找到相关文章

最新更新