Javascript - Google Drive v3 API和功能

问题描述 投票:1回答:1

尝试使用JavaScript SDK创建与google drive v3 api的连接。

基本上我想要实现的最终目标是从谷歌驱动器访问各种文件并添加元数据(但还没有那么远)。

通过谷歌驱动器api指南(https://developers.google.com/drive/api/v3/quickstart/js)上的教程工作正常,我能够授权自己访问文件等

我正在努力的是试图清理代码,所以我不会一遍又一遍地重复自己。

我已经使用了GDrive Python SDK,我可以使用它,但我真的很难用JavaScript SDK,它可能只是我需要一个现实检查,因为我试图将python方面带入JavaScript?

因此,下面的代码循环遍历每个搜索结果页面,并使用扩展名ZIP,RAR或TAR查找我的gDrive中的所有文件,然后将结果插入HTML(基于google驱动器示例):

function listFiles() {
    gapi.client.load('drive', 'v3', function () {
        gapi.client.init({}
        ).then(function () {
            gapi.client.drive.files.list({
                'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                'pageSize': 10,
                'fields': "nextPageToken, files(id, name)",
            }).then(function (respo) {
                var token = respo.result.nextPageToken;
                gapi.client.drive.files.list({
                    'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                    'fields': "nextPageToken, files(id, name)",
                    'pageToken': token
                }).then(function (result) {
                    appendPre('Files:');
                    console.log(result);
                    var files = result.result.files;
                    if (files && files.length > 0) {
                        for (var i = 0; i < files.length; i++) {
                            var file = files[i];
                            console.log(files[i]);
                            arr.push(files[i]);
                            appendPre(file.name + ' (' + file.id + ')');
                        }
                    } else {
                        appendPre('No files found.');
                    }
                })
            });
        });
    });
}

这有效,但我该怎么做呢?例如创建函数?我可能需要定期请求这个文件列表,所以我尝试创建一个函数:

function getFiles() {gapi.client.load('drive', 'v3', function () {
    gapi.client.init({}
        ).then(function () {
            gapi.client.drive.files.list({
                'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                'pageSize': 10,
                'fields': "nextPageToken, files(id, name)",
            }).then(function (respo) {
                var token = respo.result.nextPageToken;
                gapi.client.drive.files.list({
                    'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                    'fields': "nextPageToken, files(id, name)",
                    'pageToken': token
                })
            })
        })
    });
}

但是当我打电话给它时,我只是得到'未定义'

然后我读到某处我可以将其创建为变量并使用'.then'调用它,就像我在完整示例中所做的那样。

但是在调用变量和执行'.then'时,这会给'und​​efined':

getFiles.then(function(response){console.log(response)})

无法获取未定义或空引用的属性'then'

我究竟做错了什么?显然有些东西,可能是真的很愚蠢= [

任何帮助将不胜感激=]

javascript promise google-drive-api refactoring google-api-js-client
1个回答
0
投票

我已经尝试过你的代码,它正在我的身边。身份验证后,您无需再次调用gapi.client.init({}).then()

这是工作代码:

function initClient() {
        gapi.client.init({
          discoveryDocs: DISCOVERY_DOCS,
          clientId: CLIENT_ID,
          scope: SCOPES
        }).then(function () {
          // Listen for sign-in state changes.
          gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

          // Handle the initial sign-in state.
          updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
          authorizeButton.onclick = handleAuthClick;
          //signoutButton.onclick = handleSignoutClick;

          gapi.client.drive.files.list({
                'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                'pageSize': 10,
                'fields': "nextPageToken, files(id, name)",
            }).then(function (respo) {
                appendPre('Files:');
          var files = respo.result.files;
          if (files && files.length > 0) {
            for (var i = 0; i < files.length; i++) {
              var file = files[i];
              appendPre(file.name + ' (' + file.id + ')');
            }
          } else {
            appendPre('No files found.');
          }
            })
        });
      }

我已将您的代码添加到最初的initClient()中,并且按预期工作。

@Tanaike是正确的,您可以将pageSize调整为1000,以便在一个页面中获取所有文件。但是请尝试阅读这个tutorial来实现nextpageToken


UPDATE

如果您指的是在java脚本的函数内调用的函数,那么它是可能的,它也存在于Javascript快速入门中。

/**
       *  Initializes the API client library and sets up sign-in state
       *  listeners.
       */
      function initClient() {
        gapi.client.init({
          discoveryDocs: DISCOVERY_DOCS,
          clientId: CLIENT_ID,
          scope: SCOPES
        }).then(function () {
          // Listen for sign-in state changes.
          gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

          // Handle the initial sign-in state.
          updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
          authorizeButton.onclick = handleAuthClick;
          signoutButton.onclick = handleSignoutClick;
        });
      }

      /**
       *  Called when the signed in status changes, to update the UI
       *  appropriately. After a sign-in, the API is called.
       */
      function updateSigninStatus(isSignedIn) {
        if (isSignedIn) {
          authorizeButton.style.display = 'none';
          signoutButton.style.display = 'block';
          listFiles();
        } else {
          authorizeButton.style.display = 'block';
          signoutButton.style.display = 'none';
        }
      }
 /**
       * Print files.
       */
      function listFiles() {
        gapi.client.drive.files.list({
          'pageSize': 10,
          'fields': "nextPageToken, files(id, name)"
        }).then(function(response) {
          appendPre('Files:');
          var files = response.result.files;
          if (files && files.length > 0) {
            for (var i = 0; i < files.length; i++) {
              var file = files[i];
              appendPre(file.name + ' (' + file.id + ')');
            }
          } else {
            appendPre('No files found.');
          }
        });
      }

如果你检查代码,initClient()调用一个函数updateSigninStatus,它也调用listFiles()来打印你的驱动器中的可用文件。

© www.soinside.com 2019 - 2024. All rights reserved.