AngularJS依次执行承诺
AngularJS executing promises in turn
我需要能够依次执行一系列异步事件,但是每个事件的执行取决于最后一个事件的结果。有没有办法动态地实现这一点?考虑以下代码作为我试图实现的示例。
$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;
相关文章:
- Bluebird中承诺链数组的串行执行
- 执行一系列 Javascript 承诺一个接一个地解决
- 控制承诺执行顺序
- 如何按顺序执行承诺数组
- 无法执行链式承诺
- 循环超出范围,不执行承诺链
- 如何将 $http.put 封装到一个函数中,该函数执行某些操作,然后返回通过或失败的承诺
- 在猫鼬中创建承诺时,不会调用执行器
- 嵌套承诺执行不同步
- nodeJS中的承诺/承诺中的回调/执行顺序是不对的
- 两个捕获的承诺/块声明都没有执行
- 从数组中按顺序执行一堆 WinJS 承诺
- Javascript Jquery在外部样式表更改/重新加载承诺方式后执行代码
- $.延迟:如何检测每个承诺何时执行
- 无论承诺是否履行,如何执行相同的操作
- 链式jQuery承诺提前执行
- 承诺链不使用 Q 承诺库按顺序执行
- AngularJs 单元测试 - 模拟承诺不执行“然后”
- 如何使用本机 JavaScript 承诺执行延迟模式
- 链接承诺执行两个操作