2014-09-16 5 views
1

Я новичок в Bacon.js, обычно пишу программы в Haskell. По моему опыту с Haskell, я хочу описать некоторые ситуации в Bacon.js как чисто функциональный подход.Устранить побочные эффекты Bacon.js

Вот пример ситуации.

  • triggerStream - источник потока.
  • resultStream пытается получить доступ к ajax, когда происходят события triggerStream.
  • resultStream2 также пытается получить доступ к ajax после завершения доступа ajax resultStream.

Это мой подход:

### ======= 
# Streams 
# ======= ### 
triggerStream =() -> 
    Bacon.fromArray([1,2,3]) 

resultStream = 
    triggerStream() 
    .flatMap((n) -> Bacon.fromPromise($.ajax(toAjax n))) 
    .zip(triggerStream(), (r,t) -> 
     {result: r, trigger: t} 

resultStream2 = 
    resultStream  # (*) 
    .flatMap((o) -> Bacon.fromPromise($.ajax(toAjax2 o))) 
    .zip(resultStream, (r2,r1) -> 
     {result: r2, trigger: r1.trigger} 

### ======= 
# Assignments 
# ======= ### 

triggerStream() 
    .onValue(beforeAjax1) # (a) 
resultStream 
    .onValue(afterAjax1) # (b) 
resultStream2 
    .onValue(afterAjax2) # (c) 

(а) supporsed будет выполняться после каждого события запуска, другими словами, он выполняется до resultStream «s АЯКС доступа.

(b) Предполагается, что он будет запущен после доступа resultStream к ajax.

(c) Предполагается, что он будет запущен после доступа resultStream2 к ajax.

Я знаю, что потоки или свойства Bacon.js оказывают побочные эффекты на себя, поэтому мой код не может работать хорошо. В (b) события resultStream удаляются из объекта resultStream, что приводит к пустующему потоку в (*).

Подход, который меняет resultStream на функцию (например, triggerStream), работает хорошо, но вызывает независимые два раза доступ к ajax resultStream, когда (b) и (c).

Есть ли идея реализовать мой подход?

+2

Проблема заключается в том, что вы используете Bacon.fromArray в качестве источника. Bacon.fromArray возвращает поток, который имеет немного забавное поведение, в том смысле, что он передает его содержимое первому подписчику. Вы можете попробовать более реалистичный источник, такой как Bacon. По возможности сделать эту работу. – raimohanska

+0

Факт о Bacon.fromArray для меня новенький. Спасибо! Но он пока не работает ... 'onValue()' at (b) ест весь поток и (c) не работает. – user3749167

+0

Извините, но меня неправильно поняли. Твоя работа. Потрясающие! – user3749167

ответ

4

Проблема в том, что вы используете Bacon.fromArray в качестве источника. Этот метод возвращает синхронно реагирующий поток, который практично передает его содержимое первому подписчику.

Вы можете попробовать более реалистичный источник, например Bacon.sequentially, чтобы сделать эту работу. Или вы можете сделать stream.delay(0), чтобы изменить его на асинхронно реагирующий.

Смотрите также Bacon.js FAQ: https://github.com/baconjs/bacon.js/wiki/FAQ#why-isnt-my-subscriber-called

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

  • Нет связанных вопросов^_^