如何将函数的执行延迟到我的所有$resources
都解决之后?我的目标是能够在所有$resources
解析后解析log
数组,并将单个成功通知推送到 UI,而不是每次成功推送一个通知。
我在下面的代码基于这个问题的角度 - 访问多个http调用的数据 - 如何解决承诺。我意识到$scope.promises
是空的,因为item.$save()
不返回任何内容,但我希望你能看到我正在尝试将未解决的承诺推送给promises
数组。
$scope.save = function () {
$scope.promises = [];
$scope.log = [];
angular.forEach($scope.menuItems, function(item) {
$scope.promises.push(item.$save(function(menu){
debugger; // execution gets here 2nd
console.debug("success");
$scope.log.push(msg: 'success');
}));
}, this);
$q.all($scope.promises).then(function() {
debugger; // execution gets here 1st
console.debug("all promises resolved");
});
};
由于 $save
不返回 promise,因此您需要一个中间承诺:
angular.forEach($scope.menuItems, function(item) {
var d = $q.defer(); // <--- the intermediate promise
item.$save(
function(menu){
debugger;
console.debug("success");
$scope.log.push(msg: 'success');
d.resolve(menu); // <--- resolving it, optionally with the value
},
function(error){
d.reject(error); // <--- rejecting it on error
}
);
$scope.promises.push(d.promise);
}, this);
顺便说一句,不要忘记扔掉一系列承诺,否则你会留下垃圾:
$q.all($scope.promises).then(...).always(function() {
$scope.promises = null;
});
而且,如果$scope.promises
没有暴露给视图,它不需要在范围内;它可以只是一个变量。