Помогите пожалуйста понять один момент в работе отписки при помощи takeUntil. Вот классический пример:
import { Component, OnDestroy, OnInit } from '@angular/core';
import 'rxjs/add/operator/takeUntil';
import { Subject } from 'rxjs/Subject';
import { MyThingService } from '../my-thing.service';
@Component({
selector: 'my-thing',
templateUrl: './my-thing.component.html'
})
export class MyThingComponent implements OnDestroy, OnInit {
private ngUnsubscribe: Subject<void> = new Subject<void>();
constructor(
private myThingService: MyThingService,
) { }
ngOnInit() {
this.myThingService.getThings()
.takeUntil(this.ngUnsubscribe)
.subscribe(things => console.log(things));
this.myThingService.getOtherThings()
.takeUntil(this.ngUnsubscribe)
.subscribe(things => console.log(things));
}
ngOnDestroy() {
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
}
Я объясню что по моему пониманию здесь происходит и затем спрошу про непонятное место.
1. существует оператор take(N) , который берет N значений, излучённых потоком
2. но существует оператор takeUntil(obs) , который берёт значения из потока до тех пор, пока поток obs не начнёт излучать любые значения. После того как это произошло, значения из основного потока не берутся
3. обычно в качестве obs из пункта 2 используется Subject. Потому что он умеет не только излучать события, но и принимать
4. итак, сначала мы объявляем в классе переменную ngUnsubscribe типа Subject
5. затем в каждый запрос мы добавляем своего рода условный оператор .takeUntil(this.ngUnsubscribe)
6. takeUntil takeUntil начнёт работать(а следовательно прекратит получение данных из основного потока) в момент срабатывания ngOnDestroy(). То есть при попытке пользователя уйти из компонента
И теперь непонятное место:
Почему в ngOnDestroy() прописано 2 строчки?
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
Правильно ли я понимаю, что первая строчка передаёт в Subject пустое значение(но всё же значение) и это заставляет Subject излучить хоть что-то?
А по поводу this.ngUnsubscribe.complete(); у меня вообще мыслей нет. Зачем это здесь? Лишний код?