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;
谢谢你,这正是我想要的!是的!工作如期进行