Задать вопрос
@zlodiak

Как происходит отписка через takeUntil?

Помогите пожалуйста понять один момент в работе отписки при помощи 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(); у меня вообще мыслей нет. Зачем это здесь? Лишний код?
  • Вопрос задан
  • 659 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@dmitrygavrish
1) Правильно ли я понимаю, что первая строчка передаёт в Subject пустое значение(но всё же значение) и это заставляет Subject излучить хоть что-то?

Все верно. В коде указан тип
private ngUnsubscribe: Subject<void> = new Subject<void>();
, cледовательно ничего кроме "пустого" значения передать в .next() компилятор тайпскрипта и не разрешит.

2) А по поводу this.ngUnsubscribe.complete();

The Observer callback to receive a valueless notification of type complete from the Observable. Notifies the Observer that the Observable has finished sending push-based notifications.

Т.е., судя по всему, никто больше слушать данную последовательность не будет/не сможет после вызова данного метода
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы