繁体   English   中英

在循环中调用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);
  }
);

这是我设法解决的方法(参考: Cordova resolvaLocalFileSystemUrl()无法异步进行循环

    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);
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM