忽略流中的事件,直到满足条件?

U A*_*los 5 frp rxjs bacon.js kefir.js

我从按钮单击事件创建了一个流。该按钮对应于对数据库的创建操作。显然,我希望数据库操作仅触发一次(至少直到触发完成)。有没有办法忽略事件createButtonStream直到Api.create返回?也就是说,第一个事件应调用#Api.create,随后的事件应被忽略,直到#Api.create返回。

createButtonStream
   .flatMap(() => Api.create()) //Needs to fire once until doSomething() is called
   .onValue(result => doSomething(result))
Run Code Online (Sandbox Code Playgroud)

我想到的唯一方法是使用全局状态...而我宁愿不这样做。

//i don't wanna do this
let condition = true

createButtonStream
   .filter(() => condition)
   .map(() => condition = false)
   .flatMap(() => Api.create())
   .onValue(result => {condition = true; doSomething(result)})
Run Code Online (Sandbox Code Playgroud)

Oll*_*liM 0

您可以使用等待。你需要一辆巴士来解决先有鸡还是先有蛋的问题。

const filterBus = new Bacon.Bus()

const createDone = createButtonStream
  .filter(filterBus.toProperty(true))
  .flatMap(() => Api.create())

const inProgress = createButtonStream.awaiting(createDone)
filterBus.plug(inProgress.not())

createDone.onValue(doSomething)
Run Code Online (Sandbox Code Playgroud)