Подписка в RxJS - это одноразовый ресурс, который обычно представляет собой выполнение Observable. У него есть метод unsubscribe
, который позволяет нам избавиться от ресурса, удерживаемого подпиской, когда мы закончим.
В более ранних версиях RxJS он также назывался «Disposable».
Основное использование
Базовый пример подписки можно увидеть в следующем коде:
import { of } from "rxjs"; const observable = of(1, 2, 3); const subscription = observable.subscribe(val => console.log(val)); subscription.unsubscribe();
В приведенном выше коде subscription
, возвращаемый, когда мы вызываем subscribe
в Observable, - это subscription
. У него есть метод unsubscribe
, который мы вызвали в последней строке для очистки, когда Observable отписался.
Объединение подписок
Мы можем комбинировать подписки с методом add
, который поставляется с объектами подписки.
Например, если у нас есть 2 наблюдаемых:
import { of } from "rxjs"; const observable1 = of(1, 2, 3); const observable2 = of(4, 5, 6); const subscription1 = observable1.subscribe(val => console.log(val)); const subscription2 = observable2.subscribe(val => console.log(val)); subscription1.add(subscription2);
В приведенном выше коде у нас есть 2 подписки, subscription1
и subscription2
, которые мы объединили вместе с add
методом subscription1
.
subscription1
является родителем subscription2
.
Мы должны получить
1 2 3 4 5 6
как выход.
Когда мы объединяем Подписки вместе, мы можем отказаться от подписки на все Подписки, которые были объединены вместе, вызвав unsubscribe
для первой Подписки, для которой вызывается метод add
.
Например, если у нас есть:
import { interval } from "rxjs"; const observable1 = interval(400); const observable2 = interval(300); const subscription = observable1.subscribe(x => console.log(x)); const childSubscription = observable2.subscribe(x => console.log(x)); subscription.add(childSubscription);
Затем вызов unsubscribe
на subscription
отменит подписку на все объединенные подписки.
setTimeout(() => { subscription.unsubscribe(); }, 1000);
Отмена дочерних подписок
Мы можем отменить дочерние подписки с помощью remove
метода подписки. В качестве аргумента требуется дочерняя подписка.
Чтобы использовать его, мы можем написать что-то вроде следующего кода:
import { interval } from "rxjs"; const observable1 = interval(400); const observable2 = interval(300); const subscription = observable1.subscribe(x => console.log(x)); const childSubscription = observable2.subscribe(x => console.log(x)); subscription.add(childSubscription); (async () => { await new Promise(resolve => { setTimeout(() => { subscription.remove(childSubscription); resolve(); }, 600); }); await new Promise(resolve => { setTimeout(() => { subscription.unsubscribe(); childSubscription.unsubscribe(); resolve(); }, 1200); }); })();
После удаления childSubscription
он больше не является дочерним по отношению к subscription
Подписке.
Поэтому мы должны позвонить unsubscribe
для обеих подписок по отдельности, чтобы очистить обе подписки, как только мы закончим.
Подписки позволяют нам получать значения, передаваемые из Observable. Мы можем объединить несколько подписок вместе с методом add
, который принимает дочернюю подписку в качестве аргумента.
Когда они будут объединены, мы сможем отписаться от них вместе.
Мы можем удалить Подписку как дочернюю по отношению к другой Подписке с помощью метода remove
.