Игнорировать события в потоке, пока условие не будет выполнено?

Я создал поток из событий нажатия кнопки. Кнопка соответствует действию создания в базе данных. Очевидно, я хочу, чтобы действие базы данных запускалось только один раз (по крайней мере, до его завершения). Есть ли способ игнорировать события на 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)})

2 ответа

В RxJS вы используете flatMapFirst или же exhaustMap оператор (если используется RxJS 5)

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

flatMapFirst будет молча отбрасывать события, если они поступят до завершения первого источника, метод не должен вызываться.

Вы можете использовать в ожидании. Вам нужен автобус, чтобы обойти проблему курицы и яйца.

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)
Другие вопросы по тегам