如何知道角度何时完成推迟

时间:2014-04-02 10:26:06

标签: javascript angularjs

嗨,我正在努力理解Angular的痛苦和承诺。 我想知道所有的承诺何时完成,所以我可以隐藏“加载”消息。 所以这是我的代码示例:

$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.";
    });
}

问题是,在大数据拉动的情况下,$ scope.Message在数据插入页面之前显示“已加载”。 难道我还需要推迟insertToScope吗? InsertToScope只读取:

function insertToScope($scope, a) {
   //get root scope
   var rs = angular.element("#ngRootContainer").scope();
   rs.parentAssig.push(a);
}

部门服务看起来像这样:

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;
    }
});

所以我的问题是,在完成所有承诺后,我需要做什么来调用函数? 提前感谢您的反馈。

1 个答案:

答案 0 :(得分:1)

$q.all应该做你需要的。如果您的代码不起作用,我会看到两个选项:

  • 您传入的promiseList不包含您要等待的所有承诺。调试你的代码并检查是否传入了所有的promises。确保它是你传递的数组作为第一个参数。
  • 在您希望解决之前,您传递的承诺已经解决。如果你记录了A&#39;在insertToScope和&#39; B&#39;在您then的{​​{1}}中,您应该看到
$q.all

在控制台中。

这是一个简单的plunkr,展示了如何使用A ... A B http://plnkr.co/edit/9QH9Y0w7DG0WCouMuX82?p=preview