首页 > 解决方案 > 在循环中调用 resolveLocalFileSystemURL

问题描述

我有一个包含文件名的数组。我的代码需要检查每个文件以了解它是需要下载还是已经存在。问题是当我从循环中调用 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)
{
...
}

标签: javascriptcordovaphonegap

解决方案


您可以使用 Array.prototype.map 和 new Promise 将文件转换为一组 Promise 并使用 Promise.all 将所有 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);
  }
);

推荐阅读