javascript - “完成”一个 rxjs 主题的目的是什么?
问题描述
在 rxjs Subject 上调用 complete() 的目的是什么?
例如:在 takeUntil() 通知程序 Observable 上调用完成。为什么我们需要这样做,而不仅仅是调用 next() 并完成它?
PS如果这只是一个约定,为什么会这样?
解决方案
complete
通常在主题上调用以completed
通过流发送事件。这样做是为了触发等待该通知的观察者。例如:
var subject = new BehaviorSubject<int>(2);
var subjectStream$ = subject.asObservable();
var finalize$ = subjectStream$.pipe(finalize(()=> console.log("Stream completed")));
var fork$ = forkJoin(subjectStream$,of(1));
....
finalize$.subscribe(value => console.log({value}));
//output: 2, notice that "Stream completed" is not logged.
fork$.subcribe(values => console.log({values});
// no output, as one of the inner forked streams never completes
此外,是一种安全措施,以避免内存。泄漏,因为在源流上调用 complete 将删除对所有订阅观察者的引用,从而允许垃圾收集器最终处理任何未订阅的Subscription
实例。
推荐阅读
- visualization - Google Data Studio 地理地图在使用 Lat,Long 作为维度时保持空白
- javascript - 子 div 上的 OnClick 不应触发特定子级的父 div 的 onClick 方法
- amazon-web-services - Aurora PostgreSQL 迁移的 AWS DMS 任务错误
- jsf - 如何在 Jsf 的 selectOneRadio 的 selectItem 中使用一些枚举值
- php - 如何根据php中的数组键删除数组数组中的重复项?
- apostrophe-cms - 如何在我的无头项目中创建一个包含许多片段的主页?
- javascript - 如何使用媒体查询更改 Javascript 中的属性?
- vb6 - VB6 中的正确大小写
- python - 在Python中反转链表时的无限循环
- google-cloud-storage - 通过代理使用 gcs 连接器仅向 gcs 发送存储请求