Dropbox JS SDK:在.then-function中执行i ++

问题描述 投票:0回答:2

我在某种程度上努力命名这个问题,但我会尽快解释一下。

我正在使用Dropbox JavaScript SDK从特定文件夹中检索共享链接。首先,我使用以下代码从文件夹中检索文件:

var DROPBOX_PATH = path;
var ACCESS_TOKEN = '***';
var dbx = new Dropbox({ accessToken: ACCESS_TOKEN });

function listFiles() {
  dbx.filesListFolder({ path: DROPBOX_PATH })
    .then(function(response) {
      displayFiles(response.entries);
    })
    .catch(function(error) {
      console.error(error);
    });

  return false;
}

然后我将遍历这些文件以使用dbx.sharingGetSharedLinks()dbx.filesGetTemporaryLink()以及dbx.sharingGetSharedLinkFile()并获取它们的链接。问题是,如果文件夹包含几个文件,这个过程可能需要一些时间,我想使用<progress>元素来显示进度已经走了多远。

首先,我尝试使用for(var i = 0; i < files.length; i++)循环来包装上面提到的三个函数,并将i添加到dbx.sharingGetSharedLinkFile().then()进程下的进度条值,但它们不同步 - 在所有这些函数到达它们之前i值增加各自的目的,可以输出任何东西

我尝试用while()循环替换它并将i++放在最后一个dbx函数中,但这只会使我的Web浏览器过载并可能最终陷入无限循环。

有没有办法让i值与dbx.sharingGetSharedLinkFile().then()对应增加?


javascript dropbox dropbox-js
2个回答
0
投票

你的代码非常混乱。如果你能够使用es6或q库。只需使用这样的承诺。

var promises = [];
  

files.forEach((file) => {
  promises.push(sharingGetSharedLinks(file_path).then(filesGetTemporaryLink(download_path)).then(sharingGetSharedLinkFile(download_url)));
});

Promise.all(promises).then((values) => {
//   values are, an array of responses where each response is the three requests per each file
});

将每个请求的逻辑分开sharingGetSharedLinks返回此请求的结果并处理它,filesGetTemporaryLinksharingGetSharedLinks的结果执行相同的操作并生成新的http请求,然后最后一个重复该过程,但结果为filesGetTemporaryLink

然后你必须能够一起处理所有请求。 [r1, r2, ...]其中r1包括请求共享GetSharedLinks,filesGetTemporaryLink和sharingGetSharedLinkFile的过程。

但你必须重构所有的代码,这里是一个简单的使用Promises https://www.promisejs.org/patterns/


0
投票

要实现预期的行为,您需要使用函数而不是循环进行迭代。

您当前的代码不会像预期的那样工作,因为dropbox api方法sharingGetSharedLinks的回调只有在完成对Dropbox服务器(在此方法内)的异步请求后才会运行,而主循环继续迭代文件列表。

最后,这是所有关于承诺所以我试图用这个链接MDN about Promises和小代码示例指向正确的方向:

function displayFiles(files) {

        //... your code
        // i'll show you only changes

        var i = 0;

        (function listNextFile(){


          let file = files[i]

          if (file) {

            var name = file.name.slice(4).slice(0, -7).replace('_', '/'),
                file_path = file.path_display;

            dbx.sharingGetSharedLinks({ path : file_path }).then(function(response){

              // ...
              // there is your code
              // after all you need to icrease counter and call function again

              i++
              listNextFile();

            });

          }

        })()

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