首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应对Bacon.js的副作用

应对Bacon.js的副作用
EN

Stack Overflow用户
提问于 2014-09-16 21:42:00
回答 1查看 190关注 0票数 1

我是Bacon.js的新手,通常用Haskell写程序。根据我对Haskell的经验,我想将Bacon.js中的某些情况描述为纯粹的类似于功能的方法。

下面是一个例子。

  • triggerStream是源流。
  • resultStreamtriggerStream的事件发生时尝试ajax访问。
  • resultStream2还在resultStream的ajax访问完成后尝试ajax访问。

这是我的方法:

代码语言:javascript
复制
### =======
# 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访问。

有什么办法可以实现我的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25878888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档