【问题标题】:Ignore events on stream until condition is satisfied?在满足条件之前忽略流中的事件?
【发布时间】:2016-05-25 08:43:00
【问题描述】:

我从按钮点击事件创建了一个流。该按钮对应于数据库上的创建操作。显然,我希望数据库操作只触发一次(至少在它完成之前)。有没有办法在Api.create 返回之前忽略createButtonStream 上的事件?即,第一个事件应该调用#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)})

【问题讨论】:

  • 在开菲尔你可以尝试使用 flatMapFirst
  • @iofjuupasli 如果我没记错的话,flatMapFirst 仍然会触发 Api.create ...它只会忽略响应,直到第一个完成。所以换句话说,它仍然会调用数据库......这是我试图阻止的。
  • 好像不是var source = Kefir.sequentially(100, [1, 2, 3]); var result = source.flatMapFirst(x => { console.log(x); return Kefir.interval(40, x).take(4); }); result.log(); 。记录到控制台1 3

标签: rxjs frp bacon.js kefir.js


【解决方案1】:

RxJS 中,您使用 flatMapFirstexhaustMap 运算符(如果使用 RxJS 5)

createButtonStream
   .flatMapFirst(() => Api.create())       
   .subscribe(result => doSomething(result));

flatMapFirst 如果事件在第一个源完成之前到达,将静默丢弃事件,不应调用该方法。

【讨论】:

【解决方案2】:

您可以使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-29
    • 2019-11-11
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多