Вызов resolLocalFileSystemURL в цикле - PullRequest
0 голосов
/ 03 мая 2018

У меня есть массив, который содержит имена файлов. Мой код должен проверить каждый файл, чтобы узнать, нужно ли его загружать или он уже существует. Проблема состоит в том, что когда я вызываю функцию resolLocalFileSystemURL из цикла, он не получает правильное имя файла, он всегда получает последнее имя файла из массива. Любые предложения, как передать правильное имя файла вместе с вызовом функции?

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)
{
...
}

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вот как мне удалось ее решить (ссылка: 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);
   }
0 голосов
/ 03 мая 2018

Вы можете использовать Array.prototype.map и новое Promise для преобразования файлов в массив обещаний и Promise.all для преобразования всех обещаний в одно обещание, которое разрешится во всех значениях или отклонит при первой ошибке.

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