web-dev-qa-db-ja.com

RxJSでObservableを完了する方法

Observableがあるとします:

var observable = Rx.Observable
    .fromEvent(document.getElementById('emitter'), 'click');

どうすればそれを作成できますかComplete(すべてのトリガーonCompleteイベントサブスクライブObservers)?

10
ulfryk

この現在のフォームでは、できません。オブザーバブルは、完全ではないソースから派生しているため、完全には完了できません。できることは、このソースを完了条件で拡張することです。これは次のように機能します:

_var end$ = new Rx.Subject();
var observable = Rx.Observable
    .fromEvent(document.getElementById('emitter'), 'click')
    .takeUntil(end$);
_

observableを終了する場合は、end$.onNext("anything you want here");を実行します。それは、終了イベントがあなたによって生成された場合です。これがそのイベントを生成する別のソース(キー押下など)である場合、そのソースから派生したオブザーバブルをtakeUntilの引数として直接配置できます。

ドキュメンテーション:

26
user3743222

私のために働いたのは、 take() 演算子を使用していることです。 x回のイベント後に完全なコールバックを起動します。したがって、1を渡すことにより、最初のイベントの後に完了します。

TypeScript:

private preloadImage(url: string): Observable<Event> {
    let img = new Image();
    let imageSource = Observable.fromEvent(img, "load");

    img.src = url;

    return imageSource.take(1);
}
3
Tomas Klingen

あなたが探しているのはdispose()メソッドだと思います。

from: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables

SubscribeメソッドはDisposableを返すので、シーケンスのサブスクライブを解除して簡単に破棄できることに注意してください。オブザーバブルシーケンスでdisposeメソッドを呼び出すと、オブザーバーはデータのオブザーバブルのリッスンを停止します。通常、早期にサブスクライブを解除する必要がある場合、またはソースオブザーバブルシーケンスの寿命がオブザーバーより長い場合を除き、disposeを明示的に呼び出す必要はありません。 Rxのサブスクリプションは、ファイナライザーを使用せずに火災と忘却のシナリオ向けに設計されています。 Observableオペレーターのデフォルトの動作は、サブスクリプションをできるだけ早く破棄することです(つまり、onCompletedまたはonErrorメッセージが発行されたとき)。たとえば、コードはシーケンスaとbの両方にxをサブスクライブします。 aがエラーをスローした場合、xはすぐにbからサブスクライブ解除されます。

1
Aiko Mastboom