Javascript 带有嵌套承诺的$q.all也使用$q.all创建

Javascript 带有嵌套承诺的$q.all也使用$q.all创建,javascript,angularjs,promise,angular-promise,angularjs-http,Javascript,Angularjs,Promise,Angular Promise,Angularjs Http,以下函数尝试返回仅在所有异步HTTP调用完成时才会解析的承诺: $scope.saveThat = function () { var promises = []; for (var i = 0; i < array.length; i++) { var newPromise = $q.defer(); promises.push(newPromise); // some more code... (fu

以下函数尝试返回仅在所有异步HTTP调用完成时才会解析的承诺:

$scope.saveThat = function () {
    var promises = [];

    for (var i = 0; i < array.length; i++) {
        var newPromise = $q.defer();
        promises.push(newPromise);

        // some more code...

        (function (i, newPromise) {
            $http(httpData)
                .success(function (response) {
                    newPromise.resolve('Success');
                })
                .error(function (response) {
                    newPromise.reject('Error');
                });
        })(i, newPromise);

    }
    return $q.all(promises);
};

我的问题是,即使promise2中的承诺尚未解决,第二个承诺(
$q.all([promise1,promise2])
也会解决。

因为您没有创建一个
承诺的数组,实际上它包含一个$q.defer()对象。你应该使用

promises.push(newPromise.promise);
而不是

promises.push(newPromise);
此外,您还需要避免这些反模式,因为您正在不必要地创建
$q
对象,因为那里有从
$http.get
返回的promise对象

代码

$scope.saveThat = function() {
    var promises = [];
    for (var i = 0; i < array.length; i++) {
      // some more code...
      var promise = $http(httpData)
        .then(function(response) {
          return 'Success'; //returning data from success resolves that promise with data
        }, function(response) {
          return 'Error'; //returning data from error reject that promise with data
        });
      promises.push(promise); //creating promise array
    }
    return $q.all(promises); //apply $q.all on promise array
};
$scope.saveThat=function(){
var承诺=[];
对于(var i=0;i
停止使用,您的问题就会消失。@Bergi,非常感谢!是的,我对承诺绝对是新手。您在哪里使用
proimise
变量?你在哪里初始化
newPromise
?@miparnisari那是我的错..复制粘贴错误。看看我的editAh我想是的:)谢谢你的帮助,我会试试你说的,让你知道。最后一个问题,而不是
返回“错误”我是否可以写入
返回“一些自定义错误消息;”
并捕获它?@miparnisari:您应该执行
抛出新错误(“自定义消息”+响应)
,这样承诺就会被拒绝
$scope.saveThat = function() {
    var promises = [];
    for (var i = 0; i < array.length; i++) {
      // some more code...
      var promise = $http(httpData)
        .then(function(response) {
          return 'Success'; //returning data from success resolves that promise with data
        }, function(response) {
          return 'Error'; //returning data from error reject that promise with data
        });
      promises.push(promise); //creating promise array
    }
    return $q.all(promises); //apply $q.all on promise array
};