2016-11-28 10 views
2

私は入力html要素を持っており、基本的なタイプが先に観測を使用して機能を検索すること:Observableで複数のdebounceTimeを使用するにはどうすればよいですか?

コード:だから基本的に私はそれぞれの間で少なくとも200ミリ秒で入力した任意のキーワードをキャプチャしてい

@Output() keywordChange = new EventEmitter(); 

    this.keyword$ = Observable.fromEvent(myInput, 'keyup'); 
    this.keyword$ 
     .map((event: any) => event.target.value) 
     .debounceTime(200) 
     .subscribe(keyword => this.keywordChange.emit(keyword)); 

キーアップ。

これで、「最新の検索」を表示するために、ユーザーがCookieで検索しているものはすべて保存しますが、保存する前に3000ミリ秒待っています。 値が入力されました。

は、私は次のコードは動作しません知っているが、ただ、私はこれに似何かを達成したい示すために:異なるdebounceTimesで複数の物事を行うための演算子をチェーン、

this.keyword$ 
     .map((event: any) => event.target.value) 
     .debounceTime(200) 
     .subscribe(keyword => this.keywordChange.emit(keyword)) 
     .debounceTime(3000) 
     .subscribe(keyword => addKeyWordToLatestSearches(keyword)); 

は何とかこのことは可能ですか?

答えて

1

放出されたデータを2つの独立した方法で処理する可能性があるため、最初のサブスクリプションはshareでしょうか?元のソースで2回購読したくないので、RxJSのshare operatorを使うことができます。

const keyupValue$ = this.keyword$ 
    .map((event: any) => event.target.value) 
    .share(); 

keyupValue$ 
    .debounceTime(200) 
    .subscribe(keyword => this.keywordChange.emit(keyword)) 

keyupValue$ 
    .debounceTime(3000) 
    .subscribe(keyword => addKeyWordToLatestSearches(keyword)); 
+1

この例では、共有を使用しない場合の影響は何ですか?私はそれを試してみて、あなたの例はshare()なしでも動作するようです。シェアは単純に複数のサブスクリプションではなく、1つのサブスクリプションを追跡するだけで済むようにしていますか? – Weblurk

+0

'share()'はストリームマルチキャストを行い、したがって両方のサブスクリプションは同じソースになります。あなたの例はシンプルさのために 'share()'なしで動作します。あなたが資源の重いサブスクリプション(dbコール、httpコールなど)を開始するとき、 'share()'は行く方法です –

+0

これは実際にあなたのソースに依存します。しかし、たとえば角度2のhttp APIを使用して共有せずにこの処理を行う場合、すべてのサブスクライバが独自のhttp要求をトリガーします。したがって、 'share'メソッドは、元のストリームのイベントを再利用することによって複数のサブスクライバを処理するサブスクライバとオブザーバブルの組み合わせと考えることができるサブジェクトを作成します。 –

関連する問題