繁体   English   中英

forkJoin 上的 takeUntil 是否调用 forkJoined observables 上的函数?

[英]Does takeUntil on forkJoin calls the function on forkJoined observables?

调用forkJoin

forkJoin(observableA, observableB)
  .pipe(takeUntil(onDestroy$))

添加.pipe(takeUntil(onDestroy$))以在 Angular 中的组件被销毁时释放 observable。 这是否也被 observableA 和 obserableB 调用? 还是应该在传递给forkJoin所有 observable 上单独调用它?

它将自动取消订阅源 observables。

一个简单的测试来确认。

import { of, interval, forkJoin } from 'rxjs'; 
import { map, takeUntil, delay, tap } from 'rxjs/operators';

const source1 = interval(200).pipe(tap(i => console.log(i)));
const source2 = interval(300).pipe(tap(i => console.log('a' + i)));

const stop = of('stop').pipe(delay(2000));

forkJoin(source1, source2).pipe(takeUntil(stop)).subscribe();

在 2 秒内记录值然后停止。

最好的方法是像你一样使用takeUntil 那是使用它通过管道传输到forkJoin() forkJoin()将自动取消订阅其所有源 Observable(源 Observable 未完成。它们只是取消订阅)。

重要的是,如果您在源 Observables 上使用takeUntil ,您将不会得到相同的行为。

forkJoin()在其所有源 Observables 完成后发出,所以如果你的源 Observables 是例如FormControl.valueChangesActivatedRoute.queryParamMap那么完成它们将使forkJoin发射,这很可能不是你想要的。

根据文档 forkJoin发出所有已完成 observable的最后一个值,因此根据定义,内部 observable 已经完成,因此您无需取消订阅它们。

只需在.takeUntil上使用forkJoin就足够了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM