所有资源解决后如何执行功能?

时间:2013-10-31 11:57:37

标签: javascript angularjs q angular-resource

在所有$resources解决之后 之前,如何延迟执行某个功能?我的目标是能够在所有log解析后通过$resources数组进行解析,并将单个成功通知推送到UI,而不是每次成功都推送一个通知。

我的代码基于angular -- accessing data of multiple http calls - how to resolve the promises。我意识到$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");
  });
};

1 个答案:

答案 0 :(得分:0)

由于$save未返回承诺,因此您需要一个中间版:

  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 NOT 暴露给视图,则不需要在范围内;它可以只是一个变种。