2013-09-17 1 views
0

Я использую PhoneGap 2.9.0 (со сборкой) для загрузки файлов с веб-сайта для хранения на моей SD-карте на моем устройстве Android.Проверить, когда несколько файлов загружены с помощью PhoneGap

Я ищу решение для загрузки нескольких файлов и проверки того, что все эти запросы были успешно завершены.

Мне сказали, что это возможно с помощью jQuery.Deffered, но я до сих пор использовать это в любом коде, и я изо всех сил, чтобы получить мою голову вокруг него.

Существующий код работает отлично в теории, но проверяет, когда последняя загрузка в моем массиве была загружена успешно, но иногда последняя загрузка иногда возвращается успешно перед другими.

Мой код похож на ниже:

var ft = new FileTransfer(); 
var online = [ 
    'http://google.com/img/1.jpg', 
    'http://google.com/img/2.jpg', 
    'http://google.com/img/3.jpg' 
]; 
var sdcard = 'file:///storage/sdcard0/'; 

$.each(online, function(k,v) { 
    ft.download(
     online[k], 
     sdcard, 
     win, 
     fail 
    ); 
} 

var win = function(success, counter){ 
    // check if counter is last element in array 

     // redirect user to page if last element 
} 

var fail = function(error){ 
    console.log(error); 
} 
+0

Может быть, если вы кладете все ваши действия в JQuery 'когда()'? – pbenard

+0

Hi Jahnux, было бы здорово, если бы вы могли показать мне пример того, как это может работать? – pleshy

ответ

3

Я закончил с использованием SIMON mcondalds раствора и не использовали jQuery.deferred

в основном поместить все элементы, я должен был получить из Интернета в массив, когда он был успешно восстановлен, просто удалите этот элемент из массива и снова вызовите ту же функцию. В конце концов array.length будет

https://gist.github.com/macdonst/3835045

Пример кода здесь:

var remoteFiles = []; 

function downloadRemotePDF() { 
    var local2User = JSON.parse(localStorage["locallessons"]); 
    $.each(local2User, function(key) { 
     remoteFiles.push(optionsJSON + local2User[key].idcountries + '/' + local2User[key].idcurriculum + '/' + local2User[key].idoptions + '/pdf/' + local2User[key].pdfname); 
    } 

    downloadFile(); 
} 

function downloadFile() { 
    // No files left, stop downloading 
    if (remoteFiles.length == 0) { 
     return; 
    } 

    var remoteFile = remoteFiles.pop(); 
    var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1); 

    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) { 
     fileSystem.root.getFile(localFileName, {create: true, exclusive: false}, function(fileEntry) { 
      var localPath = fileEntry.fullPath; 
      if (device.platform === "Android" && localPath.indexOf("file://") === 0) { 
       localPath = localPath.substring(7); 
      } 
      var ft = new FileTransfer(); 
      ft.download(remoteFile, localPath, function(entry) { 
       // Do what you want with successful file downloaded and then 
       // call the method again to get the next file 
       downloadFile(); 
      }, fail); 
     }, fail); 
    }, fail); 
} 
+0

Я хотел показать сообщение File X of X и смотрел OnProgress Event и не хотел использовать Promises. Ваше решение элегантно, я изменил его, чтобы передать файл #, загружаемый. Спасибо за сообщение! –

0

Вот Exemple из JQuery, когда. http://api.jquery.com/jQuery.when/

Простой код (а не ваш, чтобы объяснить, 'когда')

Вот скрипку: http://jsfiddle.net/v34ra/

И простой код с, когда() сделано().

$('button').on('click', function(){ 

    $.when(

     $('div').each(function(){ 
      $(this).html( $(this).attr('attriba') ); 
     } ) 

    ).done(function(){alert('fin');}); 

}); 
Смежные вопросы