Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS-我需要取消订阅吗_Javascript_Garbage Collection_Rxjs - Fatal编程技术网

Javascript RxJS-我需要取消订阅吗

Javascript RxJS-我需要取消订阅吗,javascript,garbage-collection,rxjs,Javascript,Garbage Collection,Rxjs,如果我有这样的东西: class MyComponent { constructor() { this.interval = Observbale.interval(1000); } } const c = new MyComponent(); const subscription = c.interval.subscribe(() => { ... }) 现在让我们说,在某一点上,我正在这样做: c = null; 我仍然需要在之前调用subscription

如果我有这样的东西:

class MyComponent {

  constructor() {

    this.interval = Observbale.interval(1000);

  }
}

const c = new MyComponent();
const subscription = c.interval.subscribe(() => { ... })
现在让我们说,在某一点上,我正在这样做:

c = null;

我仍然需要在之前调用
subscription.unsubscribe()
,否则GC将处理此“泄漏”

是的。对于返回的订阅,您需要调用
取消订阅

在内部,有一个对
window.setInterval
的调用,它的实现将保存对可观察对象的引用。将引用设置为
null
不会对此产生任何影响,因此不会收集可观察对象,传递给
subscribe
的函数将继续被调用

通常,如果您订阅一个可观察对象,该可观察对象将继续调用传递给
subscribe
next
函数,除非可观察对象完成或出现错误

如果希望被观察者停止调用
next
函数并释放与订阅相关的任何资源(包括
next
函数中引用的资源),则必须调用
unsubscribe


只有当observable完成或出错时,observable才会释放资源,而无需取消订阅调用。

如果observable未完成但未使用interval,如下图所示。从NGRXI中选择store.select()。如果订阅任何既未完成也未出错的observable,你必须退订才能把事情搞清楚。这是联系的一部分。我理解这一点,但我不明白为什么。如果我有这样的东西:store.select('state')。subscribe(()=>/)如果组件被销毁,为什么我需要取消订阅。整个问题是为什么它不是GC的有效对象?原因与问题中提到的
interval
observable相同:您订阅的observable作为对传递给
subscribe
的函数的引用,它将一直调用它,直到被告知不这样做。这个函数很可能引用了上述组件。好的,你可以把它添加到答案中,以更清楚地了解任何可观察到的,而不是间隔的具体情况,所以我可以把它标记为答案。