2016-05-25 2 views
3

Я создал поток из событий нажатия кнопок. Кнопка соответствует действию 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)}) 
+0

В кефире вы можете попробовать использовать flatMapFirst – iofjuupasli

+0

@iofjuupasli, если я не ошибаюсь, flatMapFirst все равно будет запускать Api.create ... он просто проигнорирует ответы до тех пор, пока первый не завершится. Таким образом, другими словами, он все равно будет звонить в базу данных ... это то, что я пытаюсь предотвратить. –

+0

Кажется, что это не '' '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

ответ

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) 
2

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

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

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

+0

Такая же функциональность существует в беконе (https://github.com/baconjs/bacon.js/#observable-flatmapfirst), этот ответ лучше, чем тот, который я дал. – OlliM

Смежные вопросы