Dropbox JS SDK:在.then-function

时间:2017-01-12 14:22:00

标签: javascript dropbox dropbox-js

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

我正在使用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()的{​​{1}}进程下的进度条值,但是它们并不是同步的 - .then()值在所有这些函数到达各自的末端并且可以输出任何内容之前增加。

我尝试将其替换为i循环,并将while()放在最后一个dbx函数中,但这只会让我的Web浏览器过载并可能以无限循环结束。

有没有办法让i++价值与i对应增加?

2 个答案:

答案 0 :(得分: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();

            });

          }

        })()

}

答案 1 :(得分:0)

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

&#13;
&#13;
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
});
&#13;
&#13;
&#13;

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

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

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

的简单方法