我一直在使用PhoneGap 2.9.0(带有版本)从网站下载文件到我的Android设备上的SD卡上存储。
我正在寻找下载多个文件的解决方案,并检查所有这些请求是否已成功完成。
我被告知使用 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 :(得分: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);
}
答案 1 :(得分:0)
以下是jquery的示例。 http://api.jquery.com/jQuery.when/
一个简单的代码(不是你的,解释'何时')
这是一个小提琴:http://jsfiddle.net/v34ra/
使用when()。done()的简单代码:
$('button').on('click', function(){
$.when(
$('div').each( function(){
$(this).html( $(this).attr('attriba') );
} )
).done( function(){alert('fin');} );
});