YouTube API V3,多个 youtube.playlistItems.list 请求不在同一顺序

YouTupe API V3, multiple youtube.playlistItems.list requests not in the same order

我正在使用 javascript youtube API v3 在某些视频数据中请求 3 个不同的播放列表。它已成功运行,但方法 execute() 请求视频数据的顺序与循环中调用的顺序不同(刷新 page). The code is pretty simple and can be debugged here,或者如果首选此处:

var playlistsID = [...]
for (var i = 0; i < playlistsID.length; i++) {
  function playlistItem() {
    var request = gapi.client.youtube.playlistItems.list({
      part: 'snippet',
      playlistId: playlistsID[i],
      maxResults: 4
    });

    request.execute(function(response) {
      if ('error' in response) {
        console.log(response.error.message);
      }
      else {
        for (var j = 0; j < response.items.length; j++) {
          showVideo(response.items[j]);
        }
      }
    });
  }
}

function showVideo(response) {
  var videoThumb = response.snippet.thumbnails.medium.url,
      container = document.getElementById("video-container"),
      videoDiv = document.createElement("div"),
      image = document.createElement("img");
  image.setAttribute("src", videoThumb);
  container.appendChild(videoDiv);
  videoDiv.appendChild(image);
}

我的理论是 execute() 方法正在请求异步信息,但如果这是正确的,我应该如何设置请求中的顺序?

您可以使用 Javascript Promise to wait for asynchronous request to be performed and use Bluebird library to loop them in the right order from this post :

var promiseFor = Promise.method(function(condition, action, value) {
  if (!condition(value)) return value;
  return action(value).then(promiseFor.bind(null, condition, action));
});

//Load and grant access to youtube api
function googleApiKey() {

  var apiKey = 'YOUR_API_KEY';
  gapi.client.setApiKey(apiKey);
  gapi.client.load('youtube', 'v3', function() {

    promiseFor(function(count) {
      return count < playlists.length;
    }, function(count) {
      return requestVideo(playlists[count])
        .then(function(response) {

          //show video
          for (var j = 0; j < response.items.length; j++) {
            showVideo(response.items[j]);
          }

          return ++count;
        }, function(error) {
          console.log(response.error.message);
        });
    }, 0).then(console.log.bind(console, 'all done'));
  });
}

function requestVideo(playlist) {

  return new Promise(function(resolve, reject) {

    var request = gapi.client.youtube.playlistItems.list({
      part: 'snippet',
      playlistId: playlist,
      maxResults: 4
    });

    request.execute(function(response) {

      if ('error' in response) {
        reject(Error(response.error.message));
      }
      else {
        resolve(response);
      }
    });
  });
}

别忘了加上bluebird link

你可以找到一个Fiddlehere