Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 异步循环函数中的角度承诺_Angularjs - Fatal编程技术网

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;
});