take(1) 和取消订阅之间的区别

Nik*_*ili 3 observable rxjs angular

假设我不使用异步管道。我想订阅 component.ts 文件中的一些内容。如你所知,如果不是 http 请求,我应该取消订阅自己。

这是我尝试过的。

方式1)实现ondestroy钩子并在那里取消订阅

方式2)订阅时使用 take(1) 。take(1) 将自行取消订阅。

我的问题是 -为什么有人会选择方式 1 以及当我们想要取消订阅时我们应该使用哪一种(如果我们不需要异步管道)

Dav*_*nck 7

答案与 Angular 生命周期有关。

方式 1. 实现 OnDestroy 钩子并在那里取消订阅:

您的组件会执行类似的操作,很可能是在 OnInit 方法中。

this.myObservable$.pipe(takeUntil(this.unsubscribe)).subscribe(myValue => {
  // do something
});
Run Code Online (Sandbox Code Playgroud)

并且您有一个相应的私有变量和 OnDestroy 生命周期挂钩来取消订阅:

private unsubscribe: Subject<void> = new Subject();

ngOnDestroy(): void {
  this.unsubscribe.next();
  this.unsubscribe.complete();
}
Run Code Online (Sandbox Code Playgroud)

当您希望订阅在组件的生命周期内持续时,可以使用此选项。当您的可观察值接收到新值时,您的订阅将继续接收它们。

方式2.订阅时使用take(1)

this.myObservable$.pipe(take(1)).subscribe(myValue => {
  // do something
});
Run Code Online (Sandbox Code Playgroud)

这种方式将进行第一次发射并取消订阅可观察的。当然,如果该值在那之后发生变化,您将不会收到更改通知。

方法 1 将帮助您保持活力状态。假设您有一个菜单,并且您想在该菜单上选择一个选项,您希望该组件在更改时更新,并且无论您需要做什么都足够复杂,您无法使用异步管道。此订阅将在组件的生命周期内持续。

根据您想要执行的操作,您可能根本不需要订阅。相反,您可以使用 rxjs 运算符自动完成这项工作。例如,请参阅https://brianflove.com/2017-11-01/ngrx-anti-patterns/ 。

编辑:- 更新链接