首页 > 解决方案 > “完成”一个 rxjs 主题的目的是什么?

问题描述

在 rxjs Subject 上调用 complete() 的目的是什么?

例如:在 takeUntil() 通知程序 Observable 上调用完成。为什么我们需要这样做,而不仅仅是调用 next() 并完成它?

PS如果这只是一个约定,为什么会这样?

标签: javascriptrxjsobservablesubject

解决方案


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实例。


推荐阅读