Javascript 订阅的自定义完成方法是否自行取消订阅?

Javascript 订阅的自定义完成方法是否自行取消订阅?,javascript,angular,typescript,rxjs,subscription,Javascript,Angular,Typescript,Rxjs,Subscription,我创建了一个可观察的: public getData():可观察{ 返回此参数。getEndpoint() .烟斗( 开关映射((端点)=> this.http.get(端点) ), 采取(1) ); } 我订阅了observable并执行了HTTP调用 this.getData().subscribe({ 下一步:data=>this.data=data, 完成:()=>{ 这个。someActions(); }, }); 由于在可观测管道中取(1),可观测在一个发射值之后完成。因此,在我

我创建了一个可观察的:

public getData():可观察{
返回此参数。getEndpoint()
.烟斗(
开关映射((端点)=>
this.http.get(端点)
),
采取(1)
);
}
我订阅了observable并执行了HTTP调用

this.getData().subscribe({
下一步:data=>this.data=data,
完成:()=>{
这个。someActions();
},
});
由于在可观测管道中取(1),可观测在一个发射值之后完成。因此,在我们执行someActions()的地方调用complete方法。 由于此方法是自定义的,订阅是自行取消订阅,还是必须在complete方法中手动取消订阅

编辑:
如何使用订阅的完整方法取消订阅?

您永远不需要取消订阅已完成的订阅。可观察对象通过对其观察者的complete()或error()调用来完成。这是一个可观察的物体契约的一部分

考虑下面的例子

const sub = interval(250).pipe(
  take(4),
  map(x => x + 1)
).subscribe({
  next: console.log,
  complete: () => console.log("This observable completed naturally"),
  err: _ => console.log("This observable completed with an error")
});

console.log("Sub is closed, no need to unsubscribe? " + sub.closed);

setTimeout(() => {
    console.log("Sub is closed, no need to unsubscribe? " + sub.closed);
}, 1250);
控制台输出:

Sub is closed, no need to unsubscribe? false
1
2
3
4
This observable completed naturally
Sub is closed, no need to unsubscribe? true
0
1
2
... [skipping ahead]
3596
3597
3598
3599
Sub is closed: false
Sub is closed: true
这表明,将完成的观测不需要取消订阅,也不会造成内存泄漏。问题在于长期存在的观测值(比如没有
take
takeWhile
takeWhile
takeWhen
,ect运算符的间隔)

例如,在角度测量中,某些可观测值需要在组件存在的时间内存在,但不再存在。它们与组件的生命周期相关联。问题是忘记取消订阅这样的可观察对象(那些自己不完成的对象)会导致内存泄漏


同步示例: 你不需要取消订阅这个可观察的。事实上,因为它是同步运行的,所以它将在您可以取消订阅之前关闭

 const sub = of(1).subscribe();
 console.log(sub.closed); // output: true

取消订阅所需示例: 这里我们开始观察,然后等待一个小时,看看它是否关闭。然后我们取消订阅并检查它是否关闭。此间隔将持续运行直到明确取消订阅

控制台输出:

Sub is closed, no need to unsubscribe? false
1
2
3
4
This observable completed naturally
Sub is closed, no need to unsubscribe? true
0
1
2
... [skipping ahead]
3596
3597
3598
3599
Sub is closed: false
Sub is closed: true

这回答了你的问题吗<代码>完成回调在可观察对象完成时调用。如果observable完成,您不必取消订阅,一切都由rxjs在内部处理