活动作品

时间:2016-01-07 08:20:34

标签: javascript angularjs promise rxjs

我在指令中有三个$ watch。

我想在触发所有三个$ watch侦听器之后 doSomething

首次调用 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(){...};

1 个答案:

答案 0 :(得分:1)

Angular内置Kris Kowal's Q样式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
   };
});