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