事件构成

Event compositions

我在一个指令中有三个 $watches。

我想 doSomething 只有在所有三个 $watch 侦听器都被触发后。

在第一次调用 doSomething 之后,每次 $watch 监听器触发时我都想 doSomething将来。

我可以跟踪之前是否已解决各种手表并实现我想要的行为,但我想知道是否有更简单的方法。也许 RxJS 可以帮助我?

下面的天真方法...我不想在我的应用程序逻辑中跟踪此信息。

var hasAResolved = false;
var hasBResolved = false;
var hasCResolved = false;
$scope.$watch('a', setAToResolvedAndMaybeDoSomething);

$scope.$watch('b', setBToResolvedAndMaybeDoSomething);

$scope.$watch('c', setCToResolvedAndMaybeDoSomething);

function doSomething(){...};

Angular 内置了 Kris Kowal's Q style api, $q,您可以将其与 all 函数一起使用。

编辑: 根据@dfsq 的评论,我最初错过了您问题的关键点。我已经更新了下面的代码示例,以考虑允许重复调用 doSomething

var a = $q.defer();
var b = $q.defer();
var c = $q.defer();

$scope.$watch('a', function() {
    // do something with a
    a.resolve();
});
$scope.$watch('b', function() {
    // do something with b
    b.resolve();
});
$scope.$watch('c', function() {
    // do something with c
    c.resolve();
});

var doSomething = function() {
   // do some stuff
};

$q.all([a.promise, b.promise, c.promise]).then(function() {
   doSomething();

   // set a,b,c so that calling resolve will delgate to the `doSomething` function
   a = b = c = {
       resolve: doSomething
   };
});