等待多个单独的承诺解决

Wait for multiple separate promises to resolve

本文关键字:承诺 解决 单独 等待      更新时间:2023-09-26

我在不同的控制器之间有angular承诺,我想在所有这些都完成后执行函数。

是否有任何方式,如通过事件或承诺来实现这一点?

查看$q的文档,特别是$q.all()

https://docs.angularjs.org/api/ng/service/美元q

Angular文档非常清楚地说明了如何跨控制器共享数据和方法....服务(和工厂)

如果你发现自己需要协调多个控制器,这表明你需要一个服务。服务的存在就是为了帮助解决这种情况(以及更多)。

看看这个Plunkr: http://plnkr.co/edit/PXVL8YA3lOk7beSvVe5E?p=preview并确保打开控制台,以便您可以看到日志消息。

在方法A-C解决之前,服务的方法D不会执行。

MyService.$inject = ['$q', '$timeout'];
function MyService($q, $timeout) {
  var MyService = this;
  var deferredA = $q.defer();
  var deferredB = $q.defer();
  var deferredC = $q.defer();
  // go ahead and call method D right away
  // it won't fire until all the other methods have completed
  methodD(); 
  MyService.methodA = function() {
    $timeout(function() {
      deferredA.resolve();
      console.log("Method A end!");
    }, 1000);
    console.log("Method A begin!");
  };
  MyService.methodB = function() {
    $timeout(function() {
      deferredB.resolve();
      console.log("Method B end!");
    }, 1000);
    console.log("Method B begin!");
  };
  MyService.methodC = function() {
   $timeout(function() {
      deferredC.resolve();
      console.log("Method C end!");
    }, 1000);
    console.log("Method C begin!");
  };
  function methodD() {
    $q.all([deferredA.promise, deferredB.promise, deferredC.promise]).then(function() {
      console.log("Method D called!");
      // reset all the promises and call method D again
      deferredA = $q.defer();
      deferredB = $q.defer();
      deferredC = $q.defer();
      methodD();
    });
  }
}

每个控制器可以在任何时间点调用该服务。方法D只会在所有控制器调用后执行,并且它们各自的承诺都被解决了。

  Ctrl1.$inject = ['$scope', 'MyService'];
  function Ctrl1($scope, MyService) {
    $scope.go = function() {
      MyService.methodA();
    };
  }
  Ctrl2.$inject = ['$scope', 'MyService'];
  function Ctrl2($scope, MyService) {
    $scope.go = function() {
      MyService.methodB();
    };
  }
  Ctrl3.$inject = ['$scope', 'MyService'];
  function Ctrl3($scope, MyService) {
    $scope.go = function() {
      MyService.methodC();
    };
  }