Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS轮流履行承诺_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript AngularJS轮流履行承诺

Javascript AngularJS轮流履行承诺,javascript,angularjs,promise,Javascript,Angularjs,Promise,我需要能够依次执行一系列异步事件,但每个事件的执行取决于最后一个事件的结果。是否有任何方法可以动态地实现这一点?考虑下面的代码作为我试图实现的一个例子。 $scope.queries = [ { id: 1, action: function(){ var deferred = $q.defer(); Service.something($.param(someData)).$promise.then(f

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

$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循环,承诺没有什么不同,也不需要魔法,你只需要用
指定延续。然后

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;

谢谢你,这正是我想要的!是的!工作如期进行