Javascript 如何知道angular何时完成延迟
嗨,我正在努力理解角度的定义和承诺。 我想知道什么时候所有的承诺都完成了,这样我就可以隐藏一个“加载”消息。 下面是我的代码示例:Javascript 如何知道angular何时完成延迟,javascript,angularjs,Javascript,Angularjs,嗨,我正在努力理解角度的定义和承诺。 我想知道什么时候所有的承诺都完成了,这样我就可以隐藏一个“加载”消息。 下面是我的代码示例: $scope.buildTeam = function () { $scope.Message = "loading..."; var deferred = $q.defer(); var promiseList = []; c = $scope.teamModels[0]; for (index = 0; index
$scope.buildTeam = function () {
$scope.Message = "loading...";
var deferred = $q.defer();
var promiseList = [];
c = $scope.teamModels[0];
for (index = 0; index < c.quantity; ++index) {
var assignment = new teamAssignment(c.assignmentTypeId, $scope.parentAssignment.AssignmentId, c.description);
promiseList.push(departmentService.addAssignment(assignment).then(function (result) {
//added lead/captain. Now insert visually on page
insertToScope($scope, result);
}));
}
}
$q.all(promiseList).then(function () {
deferred.resolve();
$scope.Message = "Loaded.";
});
}
部门服务如下所示:
departmentModule.factory('departmentService', function ($http, $q) {
return {
addAssignment: function(assignment){
var deferred = $q.defer();
$http.post('/Department/addAssignmentReturnAssignmentRow', assignment).success(deferred.resolve).error(deferred.reject);
return deferred.promise;
}
});
所以我的问题是,我需要做什么才能在所有承诺都完成之后调用函数?
提前感谢您的反馈。
$q。所有人都应该做您需要的事情。如果您的代码不起作用,我会看到两种选择:
- 您传入一个
承诺列表
,该列表不包含您希望等待的所有承诺。调试您的代码,并检查是否传递了所有承诺。确保它是作为第一个参数传递的数组
- 你传递的承诺在你期望它们解决之前就已经解决了。如果您在
insertToScope
中登录'A',在中登录'B',然后在$q.all
中登录,您应该会看到
在控制台中
下面是一个简单的例子,展示了如何使用$q.all()
:据我所知,departmentService.addAssignment看起来是什么样子的?嗨,brianj-很好,我把它添加到了问题的末尾。谢谢。只要insertToScope
在同一个摘要循环中完成,就不会有问题。请创建一个演示问题的Plunkr。仅供参考,您正在创建许多不需要的承诺$http.post
返回一个承诺,因此您可以直接返回该承诺$q.all
返回一个承诺,因此您不需要延迟的
变量。@PieterHerroelen是正确的,您所做的被称为延迟的反模式。您好@PieterHerroelen,非常感谢。plunkr是如此简单,易于理解,我终于第一眼就“明白了”。
departmentModule.factory('departmentService', function ($http, $q) {
return {
addAssignment: function(assignment){
var deferred = $q.defer();
$http.post('/Department/addAssignmentReturnAssignmentRow', assignment).success(deferred.resolve).error(deferred.reject);
return deferred.promise;
}
});
A
...
A
B