Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何仅在完成对gapi.client.youtube的请求后执行函数?_Javascript_Youtube Api - Fatal编程技术网

Javascript 如何仅在完成对gapi.client.youtube的请求后执行函数?

Javascript 如何仅在完成对gapi.client.youtube的请求后执行函数?,javascript,youtube-api,Javascript,Youtube Api,我正在尝试从youtube播放列表的多个页面获取结果。问题是,只有在收到第一个页面的数据后,我才能执行第二个请求(对于第二个页面)。我尝试过承诺、延期、回电,但似乎没有任何效果 function requestVideoPlaylist(playlistId, pageToken, pages) { $('#video-container').html(''); var requestOptions = { playlistId: playlistId, part: 's

我正在尝试从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;
    }
  }       
}
功能请求视频播放列表(播放ID、页面标记、页面){
$('#视频容器').html('');
var请求选项={
playlid:playlid,
部分:'代码片段',
最大结果:10
};
如果(页面类型)=='undefined'){
页数=2页;
}
变量i=0
而(i++

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

显然
request.execute()
不会返回任何内容(
未定义的
),更不用说承诺了,所以将函数调用直接插入回调中,如下所示:

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');
  }
});
foo
console.log()
返回的任何内容,在本例中是
undefined
,因此您调用
.done(undefined)
,这显然不会达到您的目的。相反,您需要执行guest271314建议的操作:

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

(除此之外,我建议您加强对这类典型模式的理解。)

尝试了
.done(function(){//do stuff})
?我甚至在示例中尝试了这一点(除了使用console.log),但它不起作用-我得到了“uncaughttypeerror:无法读取未定义的属性'done'。除非你指的是别的什么,或者在别的地方,或者?我在调用整个函数时也尝试过,但是.done()中的代码在收到响应之前执行。是否
请求.execute
返回
承诺
?尝试使用
.then(function(){})
而不是
.done()
?可以创建stacksnippets、JSFIDLE来演示吗?我无法获得youtube在JSFIDLE.net中工作的授权,但确实如此。问题似乎在于加载As for.then-它不起作用,因为request.execute没有返回承诺。对预期结果不完全确定?尽管可以使用
单击
打开新的
窗口

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