我在某种程度上努力为这个问题命名,但我会尽快解释它。
我正在使用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
对应增加?
答案 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
库。只需使用这样的承诺。
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;
为每个请求分隔逻辑sharingGetSharedLinks
返回此请求的结果并对其进行处理,filesGetTemporaryLink
对sharingGetSharedLinks
的结果执行相同操作并生成新的http请求,然后最后一个重复该过程,但结果为filesGetTemporaryLink
。
然后你必须能够一起处理所有请求。 [r1, r2, ...]
其中r1包括请求共享GetSharedLinks,filesGetTemporaryLink和sharingGetSharedLinkFile的过程。
但是你必须重构所有的代码,这就是使用Promises https://www.promisejs.org/patterns/
的简单方法