Я создал поток из событий нажатия кнопок. Кнопка соответствует действию create в базе данных. Очевидно, что я хочу, чтобы действие базы данных срабатывало только один раз (по крайней мере, пока оно не завершится). Есть ли способ игнорировать события на 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)})
В кефире вы можете попробовать использовать flatMapFirst – iofjuupasli
@iofjuupasli, если я не ошибаюсь, flatMapFirst все равно будет запускать Api.create ... он просто проигнорирует ответы до тех пор, пока первый не завершится. Таким образом, другими словами, он все равно будет звонить в базу данных ... это то, что я пытаюсь предотвратить. –
Кажется, что это не '' 'var source = Kefir.sequential (100, [1, 2, 3]); var result = source.flatMapFirst (x => { console.log (x); return Kefir.interval (40, x) .take (4); }); result.log(); '' '. Журналы на консоль '1 3' – iofjuupasli