2016-01-07 4 views
0

У меня есть три $ часовых пояса в директиве.Композиции событий

Я хочу, чтобы doSomething только после того, как все три $ наблюдателя были запущены.

После йоЗотеЬЫпд был назван в первый раз, я тогда хочу 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

Угловая построил в Kris Kowal's Q стиле апи, $q, который можно использовать вместе с функцией all.

EDIT: Согласно комментарию @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 
    }; 
}); 
+0

Что касается * «После того, как doSomething был вызван в первый раз, я тогда хочу делать что-то каждый раз, когда в будущем любой из $ watch-слушателей будет стрелять.» *. – dfsq

Смежные вопросы