Angularjs 异步循环函数中的角度承诺
我有一个上传功能,可以循环选择的文件并将它们添加到服务器文件系统中 上传工厂Angularjs 异步循环函数中的角度承诺,angularjs,Angularjs,我有一个上传功能,可以循环选择的文件并将它们添加到服务器文件系统中 上传工厂 app.factory('uploadFactory', function ($upload, $q) { var uploadFactory = {}; var image = { Models: [], Images: [], uploadImages: function () { var defer = $q.defer(
app.factory('uploadFactory', function ($upload, $q) {
var uploadFactory = {};
var image = {
Models: [],
Images: [],
uploadImages: function () {
var defer = $q.defer();
for (var i = 0; i < this.Models.length; i++) {
var $file = this.Models[i].file;
(function (index) {
$upload
.upload({
url: "/api/upload/",
method: "POST",
file: $file
})
.success(function (data, result) {
// Add returned file data to model
var imageObject = {
Path: data.Path,
Description: image.Models[index].Description,
Photographer: image.Models[index].Photographer
};
image.Images.push(imageObject);
defer.resolve(result);
});
})(i);
}
return defer.promise;
}
};
uploadFactory.image = function () {
return image;
};
return uploadFactory;
});
我的问题是,该承诺仅适用于通过循环首次上传的承诺。我读过一些关于$q.all()
的文章,但我不知道如何实现它
我怎样才能使它保持在整个循环中?谢谢
解决方案
var image = {
Models: [],
Images: [],
uploadImages: function () {
for (var i = 0; i < this.Models.length; i++) {
var $file = this.Models[i].file;
var defer = $q.defer();
(function (index) {
var promise = $upload
.upload({
url: "/api/upload/",
method: "POST",
file: $file
})
.success(function (data, result) {
// Add returned file data to model
var imageObject = {
Path: data.Path,
Description: image.Models[index].Description,
Photographer: image.Models[index].Photographer
};
image.Images.push(imageObject);
defer.resolve(result);
});
promises.push(promise);
})(i);
}
return $q.all(promises);
}
};
var图像={
型号:[],
图像:[],
上传图像:函数(){
对于(var i=0;i
你是对的$q.all()
是一条路(完全未经测试——但我认为这至少是正确的方向):
app.factory('uploadFactory',函数($upload,$q){
var uploadFactory={};
变量图像={
型号:[],
图像:[],
上传图像:函数(){
var承诺=[];
对于(var i=0;i
这使得所有图像都可以上传,但请看上面我的控制器代码。执行uploadImages
函数,但是中的代码被删除。然后(函数(){
不是,它就停在那里。上传图像
是否正确返回?是否可能有一些上传失败?也许可以在$upload.upload承诺中添加一个.error回调,看看..不,我已经有一个error回调,我只是没有将它与此问题中的代码一起添加以便于阅读。我所有的上传都是有效的d Successful您能在成功处理程序中设置一个断点并确保执行defer.resolve(result)行吗?不幸的是,我看不出这里有什么问题。太好了。仅供参考,您可以附加$q.deferred()
的返回值$upload.upload(…)
到传递到$q.all()
的数组。
var image = {
Models: [],
Images: [],
uploadImages: function () {
for (var i = 0; i < this.Models.length; i++) {
var $file = this.Models[i].file;
var defer = $q.defer();
(function (index) {
var promise = $upload
.upload({
url: "/api/upload/",
method: "POST",
file: $file
})
.success(function (data, result) {
// Add returned file data to model
var imageObject = {
Path: data.Path,
Description: image.Models[index].Description,
Photographer: image.Models[index].Photographer
};
image.Images.push(imageObject);
defer.resolve(result);
});
promises.push(promise);
})(i);
}
return $q.all(promises);
}
};
app.factory('uploadFactory', function ($upload, $q) {
var uploadFactory = {};
var image = {
Models: [],
Images: [],
uploadImages: function () {
var promises = [];
for (var i = 0; i < this.Models.length; i++) {
var $file = this.Models[i].file;
var response = $upload
.upload({
url: "/api/upload/",
method: "POST",
file: $file
})
.success(function (data, result) {
// Add returned file data to model
var imageObject = {
Path: data.Path,
Description: $file.Description,
Photographer: $file.Photographer
};
image.Images.push(imageObject);
});
promises.push(response);
}
return $q.all(promises);
}
};
uploadFactory.image = function () {
return image;
};
return uploadFactory;
});