如何使用angularjs $ q.all()与异步创建的promises数组

时间:2017-09-17 03:33:26

标签: javascript angularjs angular-promise angular-resource

我正在尝试使用$ q.all()等待一堆承诺得到解决。为此,我创建了一个promises数组,并将它传递给all()方法,但这似乎不起作用。 promises数组中填充了$ resource对象返回的promises,这些promises是在每次迭代中创建的,我认为这是问题,因为promises数组是异步填充的。

我得出了这个结论,因为$ q.all()方法返回的promise,promise数组总是一个空数组。这就像$ q.all()方法不等待数组被填满。但我不确定这是不是问题。

我真的很感激这方面的任何帮助,如果用q.all()无法达到我想要的效果,我希望看到在解决所有承诺后执行代码的其他方法。 / p>

以下是我目前正在使用的代码

        var promisesArray = [];            
        var images, postObject;
        files.readFile('images.txt')
        .then(function (data) {
            images= angular.fromJson(data);                
            images.forEach(function (image, idx) {
                var deferred = $q.defer();                    
                if (!image.sent) {
                    files.readFile(image.name)
                    .then(function (data) {
                        postObject = angular.fromJson(data);
                        $resource(EndPointsService.baseURL + "images").save(postObject, function(data) {
                            deferred.resolve(data);
                            if (data.status) {                                    
                                image.sent= true;                                    
                            }
                        },function(error){
                          console.log(error);  
                        });
                        promisesArray.push(deferred.promise);
                    },function(error){
                        console.log(error);
                    });
                }
            });


              $q.all(promisesArray).then(function (data) {
                    console.log(data);
                    files.writeFile("images.txt", images)
                    .then(function (data) {                        
                        console.log(data);
                    }, function (error) {
                        console.log(error);
                    });
              });
       },function(error){
          console.log(error)
       });

1 个答案:

答案 0 :(得分:1)

promise的.then方法从返回的数据中返回一个新的promise。

在<{1}}方法中创建承诺数组 ,在.then方法中创建return $q.all承诺:

.then