1

我如何延迟执行一个函数,直到的所有问题$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");
  });
};
4

1 回答 1

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

顺便说一句,不要忘记扔掉 promise 数组,否则你会留下垃圾:

$q.all($scope.promises).then(...).always(function() {
    $scope.promises = null;
});

而且,如果$scope.promises没有暴露在视图中,则它不需要在范围内;它可以只是一个 var。

于 2013-10-31T12:15:08.917 回答