RxJS Observable:在处理最后一个订阅时执行清理?

RxJS Observable:在处理最后一个订阅时执行清理?

问题描述:

对于RxJS Observable的上次订阅处置时,执行副作用的最简洁方法是什么?在Observable已终止之前,这可能发生在RxJS 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(); 
} 

有定义订阅处置副作用,类似于doOnNextdoOnCompleteddoOnError一个更合适的方法?

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

两个选择,浮现在脑海中,这取决于你的实际使用情况:

.finally()

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(); 
+0

谢谢! 'using'方法听起来像是'create'的有效选择! 只有当Observable终止时'finally'回调才会运行,当最后一次订阅被处置时,可能不一定是这种情况。对不起,我对此不是很具体。我编辑了我的问题。 – Kimmo

+2

该文档没有很好地说明。最后,在处理订阅时实际调用该操作,其中包括终止期间或手动处理订阅期间的操作。 – Brandon

+2

我试过'终于',你完全正确!该文档目前没有提到这种行为(并且它对回调参数也有不正确的描述)。所以,这正是我所期待的!谢谢! – Kimmo