如何在解析所有资源后执行函数



如何将函数的执行延迟到我的所有$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没有暴露给视图,它不需要在范围内;它可以只是一个变量。

相关内容

  • 没有找到相关文章

最新更新