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

How to execute a function only after a request.execute to gapi.client.youtube has completed?

我正在尝试从 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: Cannot read 属性 'done' of undefined' for the .done (console.log('test)) 并且 console.log(nextPageToken) 中没有任何内容,因为该部分也在收到响应之前执行。

显然 request.execute() 没有 return 任何东西 (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);

foo 是任何 console.log() returns,在这种情况下是 undefined,所以你调用 .done(undefined) 显然不会'不要照你的意思去做。相反,您需要执行 guest271314 建议的操作:

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

(顺便提一下 that,我建议你 go read a JS book 加强对此类典型模式的理解。)