在沙盒应用程序上工作以学习 angular.js 我在代码中的几个地方遇到了以下模式。我发现自己不得不循环查询 mongoDB。据我了解,每个调用都发生在它自己的异步任务中。我如何知道所有任务何时完成?
例如,我有一个 states 数组。通常我需要为每个状态设置 someProperty 到 someNewValue。一旦所有状态都更新了,我想调用 someFunction()。
for (var i = 0; i < $scope.states.length; i++) {
$scope.states[i].someProperty = someNewValue;
$scope.states[i].$update({stateId: $scope.states[i].id}, function() {
someFunction();
});
}
目前,我能想到的唯一方法是在每次 update 成功时调用 someFunction()。我知道必须有一种更聪明、更好的方法来做到这一点。
你的方法是什么?
最佳答案
Promises 和 $q.all
(ref) 是你的 friend 。
更详细地说,您必须为每个调用做出一个 promise (如果调用本身没有返回一个),将它们推送到一个数组中并调用 $q.all(promises).then(allFinished)
。天真的情况,其中 $update()
不返回 promise :
function callUpdate(x, promises) {
var d = $q.defer();
x.$update({stateId: $scope.states[i].id}, function() {
someFunction();
d.resolve(); // it may be appropriate to call resolve() before someFunction() depending on your case
});
promises.push(d.promise);
}
...
var promises = [];
for (var i = 0; i < $scope.states.length; i++) {
$scope.states[i].someProperty = someNewValue;
callUpdate($scope.states[i], promises);
}
$q.all(promises).then(function() {
// called when all promises have been resolved successully
});
callUpdate()
之所以存在,是为了封装延迟对象处理,返回promise。
关于javascript - 如何在 angular.js 中处理多个异步任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20347272/