在rxjs Subject上调用complete()的目的是什么?
例如: 在takeUntil()通告程序Observable上调用complete。为什么我们需要这样做,而不仅仅是调用next()并完成它?
P.S。如果只是一个约定,为什么会这样呢?
答案 0 :(得分:3)
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
实例。