我是Bacon.js的新手,通常用Haskell写程序。根据我对Haskell的经验,我想将Bacon.js中的某些情况描述为纯粹的类似于功能的方法。
下面是一个例子。
triggerStream是源流。resultStream在triggerStream的事件发生时尝试ajax访问。resultStream2还在resultStream的ajax访问完成后尝试ajax访问。这是我的方法:
### =======
# 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)(a)支持在每个触发器事件之后执行,换句话说,它是在resultStream的ajax访问之前执行的。
(b)支持在resultStream的ajax访问之后被解雇。
(c)支持在resultStream2的ajax访问之后启动。
我知道Bacon.js的流或属性对自己有副作用,所以我的代码不能很好地工作。在(b)中,resultStream的事件被从resultStream对象中删除,这将导致(*)中的空流。
将resultStream转换为函数(如triggerStream)的方法工作得很好,但当(b)和(c)时,它会导致独立的两次resultStream的ajax访问。
有什么办法可以实现我的方法吗?
发布于 2014-10-02 19:40:38
问题在于您使用Bacon.fromArray作为源。此方法返回一个同步响应流,该流实际上将内容吐出给第一个订阅者。
您可能会尝试一个更现实的源代码,比如Bacon.sequentially来实现这一工作。或者您可以执行stream.delay(0),将其转换为异步响应的响应。
也请参阅Bacon.js常见问题解答:https://github.com/baconjs/bacon.js/wiki/FAQ#why-isnt-my-subscriber-called
https://stackoverflow.com/questions/25878888
复制相似问题