Cordova fileTransfer 多个文件的承诺
Cordova fileTransfer mutliple files with promises
我正在尝试从服务器下载大约 100 张图像。这很好用。
var promises = [];
angular.forEach($scope.steps, function(value, key){
promises.push(saveImageToPhone("http://192.168.178.250/w3/img/"+value.id+".jpg", value.id+".jpg"));
});
$q.all(promises).then(function(res) {
console.log("all promises done");
});
这会调用下载函数:
function saveImageToPhone(url, file) {
var deferred = $q.defer();
var url = url;
var filePath = cordova.file.applicationStorageDirectory + "files/img/" +file;
var fileTransfer = new FileTransfer();
var uri = encodeURI(url);
fileTransfer.download(
uri,
filePath,
function(entry) {
console.log(entry);
deferred.resolve();
},
function(error) {
console.log(error);
deferred.reject();
},
false,
{
headers: {
"Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
}
}
);
return deferred.promise;
}
我的想法是在 forEach 循环中调用 saveImageToPhone
函数,并让函数 return 成为一个承诺。我将这个承诺推送到一个数组,并等待这个数组中的所有承诺得到解决。
但是 console.log("all promises done")
在下载第一个图像之前被调用。我希望在所有图像下载完成后调用它。
你能给我指出正确的方向吗?
我认为您的 promise 处理是导致您出现问题的原因...试试这个:
function saveImageToPhone(url, file) {
var deferred = $q.defer();
var url = url;
var filePath = cordova.file.applicationStorageDirectory + "files/img/" +file;
var fileTransfer = new FileTransfer();
var uri = encodeURI(url);
fileTransfer.download(
uri,
filePath,
function(entry) {
console.log(entry);
// Change here
deferred.resolve();
},
function(error) {
console.log(error);
// Change here
deferred.reject();
},
false,
{
headers: {
"Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
}
}
);
// Change here
return deferred.promise;
}
但仅供参考:File Tansfer Plugin from ngCordova 已经以正确的方式将您的 cordova plugins
包装成 angularjs
。我会推荐使用它,因为它不太容易出错...
我正在尝试从服务器下载大约 100 张图像。这很好用。
var promises = [];
angular.forEach($scope.steps, function(value, key){
promises.push(saveImageToPhone("http://192.168.178.250/w3/img/"+value.id+".jpg", value.id+".jpg"));
});
$q.all(promises).then(function(res) {
console.log("all promises done");
});
这会调用下载函数:
function saveImageToPhone(url, file) {
var deferred = $q.defer();
var url = url;
var filePath = cordova.file.applicationStorageDirectory + "files/img/" +file;
var fileTransfer = new FileTransfer();
var uri = encodeURI(url);
fileTransfer.download(
uri,
filePath,
function(entry) {
console.log(entry);
deferred.resolve();
},
function(error) {
console.log(error);
deferred.reject();
},
false,
{
headers: {
"Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
}
}
);
return deferred.promise;
}
我的想法是在 forEach 循环中调用 saveImageToPhone
函数,并让函数 return 成为一个承诺。我将这个承诺推送到一个数组,并等待这个数组中的所有承诺得到解决。
但是 console.log("all promises done")
在下载第一个图像之前被调用。我希望在所有图像下载完成后调用它。
你能给我指出正确的方向吗?
我认为您的 promise 处理是导致您出现问题的原因...试试这个:
function saveImageToPhone(url, file) {
var deferred = $q.defer();
var url = url;
var filePath = cordova.file.applicationStorageDirectory + "files/img/" +file;
var fileTransfer = new FileTransfer();
var uri = encodeURI(url);
fileTransfer.download(
uri,
filePath,
function(entry) {
console.log(entry);
// Change here
deferred.resolve();
},
function(error) {
console.log(error);
// Change here
deferred.reject();
},
false,
{
headers: {
"Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
}
}
);
// Change here
return deferred.promise;
}
但仅供参考:File Tansfer Plugin from ngCordova 已经以正确的方式将您的 cordova plugins
包装成 angularjs
。我会推荐使用它,因为它不太容易出错...