Angular + RxJS:使用 takeUntil 与简单取消订阅?

Posted

技术标签:

【中文标题】Angular + RxJS:使用 takeUntil 与简单取消订阅?【英文标题】:Angular + RxJS: use of takeUntil vs simple unsubscribe? 【发布时间】:2018-07-31 00:53:09 【问题描述】:

我在组件中遇到以下代码。

private _destroy$ = new Subject<null>();

// ...

ngOnInit() 
    this.someStream$
        .pipe(filter(a=> a !== null), takeUntil(this._destroy$))
        .subscribe(a =>  );


ngOnDestroy() 
    this._destroy$.next();
    this._destroy$.complete();

谷歌搜索这件事给了我one contrasted opinion 关于声明式代码与命令式的信息,后者受到反应式架构的青睐。

考虑到这一点,我的问题是:与我一直处理相同案例的方式(用 sn-p 波纹管说明)相比,除了声明式代码和命令式代码之外,还有其他方面吗?另外,当takeUntil's谓词完成时,如何确认第一种方法最终取消订阅?

private _subscription: Subscription = null;

// ...

ngOnInit() 
    this._subscription = this.someStream$
        .pipe(filter(a=> a !== null) )
        .subscribe(a =>  );


ngOnDestroy() 
    this._subscription && this._subscription.unsubscribe();

【问题讨论】:

见***.com/questions/42490265/…和***.com/questions/45333939/…和***.com/questions/40563065/… 我认为,假设您有多个订阅并且需要手动控制所有订阅,那么使用takeUntil 方法是处理它的好方法。关于如何确认takeUntil如何工作的第二个问题,您可以阅读源代码,或创建简单的间隔流,然后在一段时间后与takeUntil结合。 @TiepPhan:这不是takeUntil 工作原理的基本概念问题。它是关于细节的:它真的取消订阅,还是只是停止转发项目?这比创建一个简单的流更难测试 【参考方案1】:

显然,takeUntil 将向订阅方发送“完成”信号,使其完成。这会导致取消订阅。

【讨论】:

以上是关于Angular + RxJS:使用 takeUntil 与简单取消订阅?的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 6 中使用 rxjs 可观察对象的目的是啥?与 async/await 相比,rxjs 的优势是啥? [复制]

Angular:如何使用 RXJS 6 调用 finally()

在 Angular 中使用 Rxjs 进行基本状态管理

Angular 入门教程系列 34 Angular6下的Http模块与Rxjs6

Angular的rxjs中的forkJoin作用和使用方法

Angular 6 RXJS 导入语法?