Я новичок в Bacon.js, обычно пишу программы в Haskell. По моему опыту с Haskell, я хочу описать некоторые ситуации в Bacon.js как чисто функциональный подход.Устранить побочные эффекты Bacon.js
Вот пример ситуации.
triggerStream
- источник потока.resultStream
пытается получить доступ к ajax, когда происходят событияtriggerStream
.resultStream2
также пытается получить доступ к ajax после завершения доступа ajaxresultStream
.
Это мой подход:
### =======
# 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).
Есть ли идея реализовать мой подход?
Проблема заключается в том, что вы используете Bacon.fromArray в качестве источника. Bacon.fromArray возвращает поток, который имеет немного забавное поведение, в том смысле, что он передает его содержимое первому подписчику. Вы можете попробовать более реалистичный источник, такой как Bacon. По возможности сделать эту работу. – raimohanska
Факт о Bacon.fromArray для меня новенький. Спасибо! Но он пока не работает ... 'onValue()' at (b) ест весь поток и (c) не работает. – user3749167
Извините, но меня неправильно поняли. Твоя работа. Потрясающие! – user3749167