Javascript 如何将angularjs$q.all()与异步创建的承诺数组一起使用

Javascript 如何将angularjs$q.all()与异步创建的承诺数组一起使用,javascript,angularjs,angular-promise,angular-resource,Javascript,Angularjs,Angular Promise,Angular Resource,我试图使用$q.all()来等待一系列承诺得到解决。为此,我创建了一个Promissions数组并将其传递给all()方法,但这似乎不起作用。 Promissions数组由$resource对象返回的承诺填充,这些对象在每次迭代中创建,我认为这就是问题所在,因为Promissions数组是异步填充的 我之所以得出这个结论,是因为$q.all()方法返回的承诺数组始终是空数组。这就像$q.all()方法不会等待数组被填满一样。但我不确定这是否是问题所在 我非常感谢您在这方面提供的任何帮助,如果$q

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

我之所以得出这个结论,是因为$q.all()方法返回的承诺数组始终是空数组。这就像$q.all()方法不会等待数组被填满一样。但我不确定这是否是问题所在

我非常感谢您在这方面提供的任何帮助,如果$q.all()无法实现我想要的功能,我希望在所有承诺都得到解决后,能看到其他执行代码的方法

这是我目前使用的代码

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

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

内创建承诺数组。然后
方法和
$q.all
向该
承诺。然后
方法:

̶v̶a̶r̶ ̶p̶r̶o̶m̶i̶s̶e̶s̶A̶r̶r̶a̶y̶ ̶=̶ ̶[̶]̶;̶            
var images, postObject;
var arrayPromise = files.readFile('images.txt')
  .then(function (data) {
    ͟v͟a͟r͟ ͟p͟r͟o͟m͟i͟s͟e͟s͟A͟r͟r͟a͟y͟ ͟=͟ ͟[͟]͟;͟
    images= angular.fromJson(data);                
    images.forEach(function (image, idx) {
        ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶                    
        if (!image.sent) {
            var promise = files.readFile(image.name)
              .then(function (data) {
                postObject = angular.fromJson(data);
                var url = EndPointsService.baseURL + "images"
                ͟r͟e͟t͟u͟r͟n͟ $resource(url).save(postObject).$promise;
            });
            promisesArray.push(promise);
        };
    });
    ͟r͟e͟t͟u͟r͟n͟ $q.all(promisesArray);
});


arrayPromise.then(function (dataArray) {
    console.log(dataArray);
    //Process data here
});

您应该将承诺推送到异步
readFile
调用之外的承诺数组。您已经在上面创建了deferred,因此您也可以将它添加到那里的数组中。当您说我应该“将它也放在那里”时,您的意思是在deferred声明之后的下一行中?从技术上讲,您是在if语句上面创建deferred。因此,如果该条件为false,则您无缘无故创建了一个延迟。您应该将延迟创建和对数组的添加都放在该条件中。很高兴知道这有帮助。请将答案标记为已接受,以便其他人知道问题已回答。