我正在尝试在创建自定义Observable后更好地理解清理。为了避免内存泄漏,您可以使用一次性功能进行清理。在这种情况下,我使用了一个计时器的Rx方法,而不是setInterval
,我相信当我调用observer.onCompleted()
内部清理计时器时,我的一次性使用是无用的。我对这个过程的理解是否正确?
function countInterval(interval, times) {
return Rx.Observable.create(function (observer) {
var timerId = Rx.Observable.timer(0, interval)
.subscribe(count => {
if (count>=times) {
console.log('')
observer.onNext(true);
// I believe this already cleans up internal
// references to setTimeout but I am not sure
observer.onCompleted();
}
});
// creating a disposable
return () => {
console.log('dispose')
timerId.dispose();
}
});
}
可以在这里玩这个例子:
https://jsbin.com/vojiduzopo/edit?js,console,output
还有一个版本,我使用setInterval
来调用' clearInterval'作为一次性的。
答案 0 :(得分:2)
这是它的工作原理。
Observable.create
。只要您正在创建的observable订阅,就会调用该函数。Subscriber
,其中会展示next
,error
和complete
。你的工作是从正确的顺序调用这三个函数,从下游观察者的角度构建看起来像一系列值的函数。Subscriber
进行适当的调用,您可能会获得资源,例如您正在使用的更基本的可观察对象的订阅。我们称之为上游观察者。 (请记住:订阅需要资源,特别是内存)。您在create函数体中创建的订阅称为内部订阅。 complete()
方法,它的错误输出,还是订阅者手动调用dispose。您对此过程的理解不正确。当您向下游观察者发出完成信号时,您下游的东西将被清理,然后您的处置方法将被调用,以便您可以清理自己。您确实有一些清理,因为您在计时器上进行的内部订阅不会因为下游被丢弃而被清除。那个计时器仍在滴答作响,直到你自己处理它为止。它不知道它下游的任何东西,因为你是那个将它连接到下游观察者的人。底部的代码处理计时器子代码是避免泄漏的必要条件。
答案 1 :(得分:1)
使用Rx.Observable.Create
创建自己的Observable时,您负责清理内存(如果需要)。在您的示例中,您将创建一个计时器,如果不清除它将导致内存泄漏。
完成流后,将调用流中的每个Observable的dispose()
函数。手动调用dispose()
表示您不再对上游的结果感兴趣,并且还会导致dispose()链接到上游,除非share()
之类的其他内容阻止。