首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript - Google Drive v3应用编程接口和函数

Javascript - Google Drive v3应用编程接口和函数
EN

Stack Overflow用户
提问于 2018-09-06 23:15:52
回答 1查看 1.5K关注 0票数 1

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

基本上,我想要实现的最终目标是从google drive访问各种文件并添加元数据(但还没有达到那个程度)。

浏览了google drive api guides (https://developers.google.com/drive/api/v3/quickstart/js)的教程,它运行良好,我能够授权自己访问文件等

我正在努力清理代码,这样我就不会一遍又一遍地重复自己的代码。

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

因此,下面的代码遍历每个搜索结果页面,在我的gDrive中找到扩展名为ZIP、RAR或TAR的所有文件,然后将结果插入到一个超文本标记语言中(基于google drive示例):

代码语言:javascript
复制
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.');
                    }
                })
            });
        });
    });
}

这是可行的,但是我该如何清理它呢?例如,创建函数?我可能需要经常请求这个文件列表,所以我尝试创建一个函数:

代码语言:javascript
复制
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”时会给出“undefined”:

函数响应(

(respo){console.log(respo)})

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

我做错了什么?显然有些事情,可能是一些非常愚蠢的事情

任何帮助都将不胜感激=]

EN

回答 1

Stack Overflow用户

发布于 2018-09-07 21:00:17

我试过你的代码,它在我这边工作。鉴权完成后,不需要再次调用gapi.client.init({}).then()

以下是工作代码:

代码语言:javascript
复制
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

更新

如果您引用的是java script的函数内部调用的函数,那么它是可能的,并且它也存在于Javascript快速入门中。

代码语言: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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52207306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档