我有一组图像,我对其进行迭代并将每个图像上传到远程服务器。文件上传后,我使用结果获取文件名并推送到另一个数组。
我遇到的问题是并非所有结果都被推送到数组中。我正在尝试用所有上传图片的结果构建一个数组。以下代码在 forEach
循环完成之前执行 lastTask
:
/**
* Upload picture
*/
$scope.upload = function () {
var token = window.localStorage.getItem('yourTokenKey');
var defer = $q.defer();
var promises = [];
var options = {
fileKey: "image",
fileName: " test.png",
chunkedMode: true,
mimeType: "image/png",
headers: {'x-auth-token': token}
};
function lastTask() {
alert(promises);
$scope.images = [];
$scope.hide();
$scope.showAlert();
$scope.putQc();
alert('finish').then(function () {
defer.resolve();
});
}
angular.forEach($scope.images, function (image) {
$cordovaFileTransfer.upload("http://server.com/file/upload", image, options).then(function (result) {
// Success!
promises.push(result.response + '.jpg');
alert(JSON.stringify(result));
console.log("SUCCESS: " + JSON.stringify(result.response));
// Error
}, function (err) {
alert(JSON.stringify(err));
console.log("ERROR: " + JSON.stringify(err));
// constant progress updates
}, function (progress) {
$scope.show();
});
});
$q.all(promises).then(lastTask);
return defer;
};
最佳答案
如果我是对的,你的 promises
数组就是问题所在,而不是推送来自 $cordovaFileTransfer.upload
的 promises 你推送的是结果 string 你得到的。
第二期,我觉得你做的是promise anti-pattern ,这里不需要 $q.defer()
。
(第三,可能无关紧要,JSON.stringify
并不是真正需要的,希望alert
是你自己定义的)
我会把它重写为:
/**
* Upload picture
*/
$scope.upload = function () {
var token = window.localStorage.getItem('yourTokenKey');
var promises = [], results; //CHANGED
var options = {
fileKey: "image",
fileName: " test.png",
chunkedMode: true,
mimeType: "image/png",
headers: {'x-auth-token': token}
};
function lastTask() {
alert(results); //CHANGED
$scope.images = [];
$scope.hide();
$scope.showAlert();
$scope.putQc();
return alert('finish'); //CHANGED
}
promises = $scope.images.map(function (image) { //CHANGED
return $cordovaFileTransfer.upload("http://server.com/file/upload", image, options).then(function (result) { //CHANGED
// Success!
results.push(result.response + '.jpg'); //CHANGED
alert(JSON.stringify(result));
console.log("SUCCESS: " + JSON.stringify(result.response));
// Error
}, function (err) {
alert(JSON.stringify(err));
console.log("ERROR: " + JSON.stringify(err));
throw err;
// constant progress updates
}, function (progress) {
$scope.show();
});
});
return $q.all(promises).then(lastTask); //CHANGED
};
关于javascript - 如何在 forEach 之后运行 lastTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881853/