在循环中调用 resolveLocalFileSystemURL
Calling resolveLocalFileSystemURL within a loop
我有一个包含文件名的数组。我的代码需要检查每个文件以确定它是需要下载还是已经存在。问题是当我从循环中调用 resolveLocalFileSystemURL 函数时,没有得到正确的文件名,它总是从数组中得到最后一个文件名。关于如何在函数调用中传递正确的文件名有什么建议吗?
var currentFile = "";
for (var i = 0; i < files.length; i++)
{
currentFile = files[i];
window.resolveLocalFileSystemURL(cordova.file.dataDirectory + currentFile , ok, downloadFile);
}
function downloadFile() {
....download currentFile....
}
function ok(entry)
{
...
}
您可以使用 Array.prototype.map 和新的 Promise 将文件转换为一组 promise,并使用 Promise.all 将所有 promise 转换为一个 promise,该 promise 将解决所有值或在第一个错误时拒绝。
Promise.all(
files.map(
function(file){
return new Promise(
function(resolve,reject){
window.resolveLocalFileSystemURL(
cordova.file.dataDirectory + currentFile,
function(file){
resolve(file)
},
function(){
//download file (maybe as promise and return that)
return downloadFile(file);
}
);
}
)
}
)
).then(
function(files){
console.log("ok",files);
}
)
.catch(
function(error){
console.log("error:",error);
}
);
这是我设法解决它的方法(参考:)
for (var i = 0; i < files.length; i++)
{
(function (i) {
window.resolveLocalFileSystemURL(cordova.file.dataDirectory + files[i]
, function(entry){
...ok....
}
, function() {
...download files[i]...
});
})(i);
}
我有一个包含文件名的数组。我的代码需要检查每个文件以确定它是需要下载还是已经存在。问题是当我从循环中调用 resolveLocalFileSystemURL 函数时,没有得到正确的文件名,它总是从数组中得到最后一个文件名。关于如何在函数调用中传递正确的文件名有什么建议吗?
var currentFile = "";
for (var i = 0; i < files.length; i++)
{
currentFile = files[i];
window.resolveLocalFileSystemURL(cordova.file.dataDirectory + currentFile , ok, downloadFile);
}
function downloadFile() {
....download currentFile....
}
function ok(entry)
{
...
}
您可以使用 Array.prototype.map 和新的 Promise 将文件转换为一组 promise,并使用 Promise.all 将所有 promise 转换为一个 promise,该 promise 将解决所有值或在第一个错误时拒绝。
Promise.all(
files.map(
function(file){
return new Promise(
function(resolve,reject){
window.resolveLocalFileSystemURL(
cordova.file.dataDirectory + currentFile,
function(file){
resolve(file)
},
function(){
//download file (maybe as promise and return that)
return downloadFile(file);
}
);
}
)
}
)
).then(
function(files){
console.log("ok",files);
}
)
.catch(
function(error){
console.log("error:",error);
}
);
这是我设法解决它的方法(参考:
for (var i = 0; i < files.length; i++)
{
(function (i) {
window.resolveLocalFileSystemURL(cordova.file.dataDirectory + files[i]
, function(entry){
...ok....
}
, function() {
...download files[i]...
});
})(i);
}