1

下面的函数试图返回一个承诺,这将只有当所有的异步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); 
}; 

而下面的代码片段调用这个功能。

// save this... 
var promise1 = $rootScope.saveThis(result.Person); 
promise1.then(function (success) { 
    }, function (error) { 
     saveErrorMessage += 'Error saving this: ' + error + '.'; 
    }); 

// save that... 
var promise2 = $rootScope.saveThat(result.Person); 
promise3.then(function (success) { 
    }, function (error) { 
     saveErrorMessage += 'Error saving that: ' + error + '.'; 
    }); 

// wait until all promises resolve 
$q.all([promise1, promise2]) 
.then(
    function (success) { 
     $scope.$emit(alertEvent.alert, { messages: 'Saved successfully!', alertType: alertEvent.type.success, close: true }); 
    }, function (error) { 
     $scope.$emit(alertEvent.alert, { messages: saveErrorMessage, alertType: alertEvent.type.danger }); 
    }); 

我的问题是,第二个承诺($q.all([promise1, promise2]))即使解决了当promise2的承诺还没有得到解决。

+0

停止(http://stackoverflow.com/q/23803743/1048572)和你的问题就会迎刃而解。 – Bergi

+0

@Bergi,非常感谢!是的,我肯定是新的承诺 –

回答

1

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

promises.push(newPromise.promise); 

代替

promises.push(newPromise); 

你也需要避免那些反模式,因为你正在创建$q对象不必要的,你有希望的对象有从$http.get返回。使用[递延反模式]

代码

$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 
}; 
+0

你在哪里使用'proimise'变量?你在哪里初始化'newPromise'? –

+1

@miparnisari那是我的错误..复制粘贴错误。在我的编辑 –

+1

啊我认为这样:)谢谢你的帮助,我会尝试你所说的并让你知道。 –