RxJS:你怎么知道在使用Observable.create时需要清理什么

时间:2016-12-07 16:13:29

标签: javascript rxjs rxjs5

我正在尝试在创建自定义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'作为一次性的。

2 个答案:

答案 0 :(得分:2)

这是它的工作原理。

  1. 您将函数传递给Observable.create。只要您正在创建的observable订阅,就会调用该函数。
  2. 您的函数会收到Subscriber,其中会展示nexterrorcomplete。你的工作是从正确的顺序调用这三个函数,从下游观察者的角度构建看起来像一系列值的函数。
  3. 为了对您收到的Subscriber进行适当的调用,您可能会获得资源,例如您正在使用的更基本的可观察对象的订阅。我们称之为上游观察者。 (请记住:订阅需要资源,特别是内存)。您在create函数体中创建的订阅称为内部订阅。
  4. 您的create函数返回一个将成为您的dispose方法的函数。当你创建的observable被调用时,它将被调用,无论是被调用的complete()方法,它的错误输出,还是订阅者手动调用dispose。
  5. 您对此过程的理解不正确。当您向下游观察者发出完成信号时,您下游的东西将被清理,然后您的处置方法将被调用,以便您可以清理自己。您确实有一些清理,因为您在计时器上进行的内部订阅不会因为下游被丢弃而被清除。那个计时器仍在滴答作响,直到你自己处理它为止。它不知道它下游的任何东西,因为你是那个将它连接到下游观察者的人。底部的代码处理计时器子代码是避免泄漏的必要条件。

答案 1 :(得分:1)

使用Rx.Observable.Create创建自己的Observable时,您负责清理内存(如果需要)。在您的示例中,您将创建一个计时器,如果不清除它将导致内存泄漏。

完成流后,将调用流中的每个Observable的dispose()函数。手动调用dispose()表示您不再对上游的结果感兴趣,并且还会导致dispose()链接到上游,除非share()之类的其他内容阻止。