12

RxJS Observableの最後のサブスクリプションが破棄されたときに副作用を実行する最もクリーンな方法は何ですか? これは、Observable が終了する前に発生する可能性があります。

Observableリソースに変更を発行する を返す関数が必要だとしましょう。すべてのサブスクリプションが破棄されたときに、クリーンアップ アクションを実行したいと考えています。

var observable = streamResourceChanges(resource);
var subscription1 = observable.subscribe(observer1);
var subscription2 = observable.subscribe(observer2);
// ...
subscription1.dispose();  // Does not perform the cleanup
subscription2.dispose();  // Performs the cleanup

サブスクリプションの破棄アクションを定義する唯一の方法は、 を使用することRx.Observable.createです。最後の破棄は、たとえば とサブスクリプションを共有することで処理できますObservable.prototype.singleInstance()

例えば:

function streamResourceChanges(resource) {
    return Rx.Observable.create(function(observer) {
        // Subscribe the observer for resource changes...
        // Return a cleanup function
        return function() {
            // Perform cleanup here...
            console.log("Cleanup performed!");
        };
    }).singleInstance();
}

doOnNextまたは と同様に、サブスクリプションの破棄の副作用を定義するより適切な方法はありますdoOnCompleteddoOnError?

var withCleanup = withoutCleanup.doOnDispose(function() {
    // Perform cleanup here...
});
4

1 に答える 1

13

実際のユースケースに応じて、次の 2 つの選択肢が考えられます。

。最後に()

source.finally(() => console.log("cleaning up")).singleInstance()

.using()

Rx.Observable
    .using(
        // allocate some disposable resource during subscribe.
        // resource.dispose() will be called during unsubscribe.
        () => new SomeResource(),

        // use the disposable resource to create your observable
        // for example...
        resource => Rx.Observable.interval(resource.time))
    .singleInstance();
于 2015-10-26T20:41:09.500 に答える