我从按钮点击事件创建了一个流。该按钮对应于数据库上的创建操作。显然,我希望数据库操作只触发一次(至少直到完成)。有没有办法在createButtonStream
返回之前忽略Api.create
上的事件?即,第一个事件应调用#Api.create,后续事件应被忽略,直到#Api.create返回。
createButtonStream
.flatMap(() => Api.create()) //Needs to fire once until doSomething() is called
.onValue(result => doSomething(result))
想到的唯一方法是使用全球状态......我宁愿不这样做。
//i don't wanna do this
let condition = true
createButtonStream
.filter(() => condition)
.map(() => condition = false)
.flatMap(() => Api.create())
.onValue(result => {condition = true; doSomething(result)})
答案 0 :(得分:3)
在RxJS
中,您使用flatMapFirst
或exhaustMap
运算符(如果使用RxJS 5)
createButtonStream
.flatMapFirst(() => Api.create())
.subscribe(result => doSomething(result));
如果事件在第一个源完成之前到达, flatMapFirst
将默默地删除事件,不应该调用该方法。
答案 1 :(得分:0)
您可以使用awaiting。你需要一辆公共汽车解决鸡和蛋的问题。
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)