API Google Drive Javascript: рекурсивно получить все файлы и поместить их в массив перед вызовом другой функции - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу использовать Google Drive Javascript API , чтобы получить все видеофайлы в определенной папке и ее подпапках.После того, как список сгенерирован, я хочу вызвать другую функцию для форматирования и отображения данных (эта часть работает нормально).

Я понимаю, что Drive API поддерживает только поиск непосредственных дочерних элементов, поэтому я должен рекурсивноискать, когда я нажимаю на типы папок.Это нормально.

Проблема, с которой я сталкиваюсь, заключается в том, что все это происходит асинхронно, и я не хочу анализировать или отображать какие-либо данные, пока массив видео не будет полностью заполнен.

Как я могу вызвать функцию только после того, как завершены все рекурсивные вызовы gapi.client.drive.files.list?

  /**
   * Get all the video files from the parent folder and child folders
   */
  var videos = [];
  function listFiles(parentFolder) {
    gapi.client.drive.files.list({
      'pageSize': 100,
      'fields': "nextPageToken, files(id, name, mimeType, thumbnailLink, createdTime, parents)",
      'supportsTeamDrives': true,
      'orderBy': "createdTime desc",
      'includeTeamDriveItems': true,
      'q': "'" + parentFolder + "' in parents and trashed = false"
    }).then(function(response) {
      var files = response.result.files;
      if (files && files.length > 0) {
        for (var i = 0; i < files.length; i++) {
          var file = files[i];
          if (file.mimeType.includes("video")) {
            videos.push(file);
          } else if (file.mimeType.includes("application/vnd.google-apps.folder")){
            /* This is the recursive call to get child folder videos */
            listFiles(file.id);
        }
      } else {
        appendPre('No files found.');
      }
    }).then(function(response) {
      /* I want to run these only after all recursive calls complete and add videos to videos[] */ 
      updateStats();
      displayVideos();
    });
  }

Как лучше всего продолжить?Вы можете помочь?:)

...