2013-10-11 2 views
2

Я изучаю фантастическую библиотеку Bacon.js для функционального реактивного программирования. Добавление обработчиков к свойству или поток легко:Как отменить подписку на обработчик в Bacon.js?

handler = function(value){... do something ...} 
property.onValue(handler) 

Say где-то вниз по линии Я хочу, чтобы отменить подписку, как это (псевдокод):

property.unsubscribe(handler) 

Есть ли способ сделать это с Bacon.js?

ответ

3

"cleaning up" Из секции Документов:

вызова функции Dispose(), который был возвращен при вызове подписки().

Таким образом, вы должны сохранить возвращение onValue:

var dispose = property.onValue(handler) 

Затем вызовите его для удаления слушателя:

dispose(); 

Here's a demo.

+0

Thank you McGarnagle! Я знаю, что это должно быть где-то, но для моей жизни я не мог этого видеть. :) – jpadvo

1

Из documentation:

stream.subscribe (f) подписывает данную функцию обработчика на поток событий. Функция получит объекты Event (см. Ниже). Вызов subscribe() возвращает функцию отмены подписки, которую вы можете вызвать для отмены подписки. Вы также можете отказаться от подписки, вернув Bacon.noMore из функции обработчика в качестве ответа на событие.

11

Оба вышеуказанных ответа верны. Лично я никогда не использовал ни одного решения. Фактически, они в основном существуют для внутренних целей и для написания пользовательских комбинаторов и интеграции.

Поэтому я рекомендую комбинаторы, такие как take, takeWhile и takeUntil. В приложении FRP сигнал, который вызывает необходимость, обычно может быть смоделирован как EventStream. В таком случае вы можете сделать:

var data, stopper // EventStreams 
data.takeUntil(stopper).onValue(..) 
+0

Было бы здорово увидеть пример этого. Является ли 'stopper' просто« шиной », которую вы используете для потока управления? – pdoherty926

+3

Ну, например, если вы хотите отреагировать на движение мыши и остановить это при нажатии клавиши, вы будете делать 'mouseMoves.takeUntil (keyPress) .onValue (..)'. Или, если вы хотите реагировать только один раз, вы будете делать 'clicks.take (1) .onValue (..)'. – raimohanska

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