AngularJS依次执行承诺

AngularJS executing promises in turn

本文关键字:承诺 执行 AngularJS      更新时间:2023-09-26

我需要能够依次执行一系列异步事件,但是每个事件的执行取决于最后一个事件的结果。有没有办法动态地实现这一点?考虑以下代码作为我试图实现的示例。

$scope.queries = [
    {
        id: 1,
        action: function(){
             var deferred = $q.defer();
             Service.something($.param(someData)).$promise.then(function(response){
                  deferred.resolve(response);
             }, function(error){
                  deferred.reject(error);
             });
             return deferred.promise;
        }
    },{
        id: 2,
        action: function(){
             var deferred = $q.defer();
             Service.something($.param(someData)).$promise.then(function(response){
                  deferred.resolve(response);
             }, function(error){
                  deferred.reject(error);
             });
             return deferred.promise;
        }
    },{
        id: 3,
        action: function(){
             var deferred = $q.defer();
             Service.something($.param(someData)).$promise.then(function(response){
                  deferred.resolve(response);
             }, function(error){
                  deferred.reject(error);
             });
             return deferred.promise;
        }
    },
];
$scope.stop = false;
angular.forEach($scope.queries, function(query) {
    if ($scope.stop === false) {
         query.action().then(function(result){
             //Everything is fine so we can continue to the next request
         }, function(error) {
            //This request produced an error so we need to stop
            $scope.stop = true;
            //Display error here
         });
    }
});

主要问题是我如何让forEach等待每个操作的结果,然后再继续执行下一个操作?

任何帮助理解这一点,并找到一个解决方案将是伟大的。我能想到的唯一解决方案是使用chained .then()手动链接这三个请求。

谢谢。

通常当我想按顺序运行东西时,我使用for或foreach循环,承诺没有什么不同,也不需要魔法,你只需要用.then

指定延续
var promise = $q.when();
angular.forEach($scope.queries, function(query) {
    promise = promise.then(function(){ 
        // no need for scope.stop, a rejection will act like a throw and it'll
        // stop executing code
        return query.action();
    });
});

如果你想知道它们什么时候完成,你可以这样做:

promise.then(function(){
    alert("All actions done!");
});
注意,你的服务代码有延迟反模式,你可以转换成这样的代码:
var deferred = $q.defer();
Service.something($.param(someData)).$promise.then(function(response){
    deferred.resolve(response);
}, function(error){
    deferred.reject(error);
});
return deferred.promise;

简单地做:

return Service.something($.param(someData)).$promise;