2016-05-25 4 views
3

ボタンクリックイベントからストリームを作成しました。このボタンは、データベース上の作成アクションに対応します。明らかに、私はデータベースアクションを1回だけ起動させたい(少なくとも完了するまで)。 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)}) 
+0

kefirでは、flatMapFirstを使ってみることができます – iofjuupasli

+0

@iofjuupasli私が間違っていないと、flatMapFirstはまだApi.createを起動します...最初のものが終了するまで応答を無視します。つまり、それはまだデータベースへの呼び出しを行います...私が防止しようとしているものです。 –

+0

'' '' 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' – iofjuupasli

答えて

0

awaitingを使用できます。鶏と卵の問題を回避するにはバスが必要です。 RxJS

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を使用している場合5)あなたは

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

flatMapFirstは黙って最初のソースが完了する前に、彼らが到着した場合、メソッドが呼び出されませすべきイベントをドロップしますflatMapFirstexhaustMap演算子を使用します。

+0

同じ機能がベーコン(https://github.com/baconjs/bacon.js/#observable-flatmapfirst)にありますが、この回答は私が与えたものより優れています。 – OlliM

関連する問題