Skip to content

fromObservable.ts ​

Назначение файла ​

Преобразование RxJS Observable в реактивный Atom.

Общая информация ​

fromObservable — это обратная функция для observe. Она обеспечивает синхронный реактивный доступ к значениям, создаваемым Observable, путем подписки на него. Возвращаемый Atom всегда хранит самое последнее значение, испущенное Observable. Если Observable выдает ошибку, Atom выбросит эту ошибку при обращении к нему.

Возвращаемый Atom является «уничтожаемым» (DestroyableAtom), что означает возможность отписки от исходного Observable, когда он больше не нужен.

Концептуальная архитектура ​

Внутри fromObservable использует createAtomSubject из @nrgyjs/core. Функция подписывается на исходный Observable и пересылает все испущенные значения (next) и ошибки (error) во внутренний AtomSubject.

Подписка на Observable автоматически завершается при уничтожении атома (например, через Scope). Это реализовано с помощью хука onDestroy, который передается в createAtomSubject.

Описание публичного API ​

fromObservable<T>(source: Observable<T> | Subscribable<T>): DestroyableAtom<T | undefined> ​

Подписывается на source и возвращает Atom, содержащий последнее значение. Поскольку начальное значение не указано, Atom инициализируется значением undefined.

  • source: RxJS Observable или Subscribable для подписки.

fromObservable<T>(source: Observable<T> | Subscribable<T>, initialValue: T): DestroyableAtom<T> ​

Подписывается на source и возвращает Atom, инициализированный значением initialValue.

  • source: RxJS Observable или Subscribable для подписки.
  • initialValue: Начальное значение для атома.

Примеры использования ​

Базовое использование ​

typescript
import { fromObservable } from '@nrgyjs/rxjs';
import { BehaviorSubject } from 'rxjs';

const subject = new BehaviorSubject(1);
const count = fromObservable(subject);

console.log(count()); // 1
subject.next(2);
console.log(count()); // 2

С начальным значением ​

typescript
import { fromObservable } from '@nrgyjs/rxjs';
import { Subject } from 'rxjs';

const subject = new Subject<number>();
const count = fromObservable(subject, 0);

console.log(count()); // 0
subject.next(10);
console.log(count()); // 10

Управление жизненным циклом через Scope ​

typescript
import { createScope } from '@nrgyjs/core';
import { fromObservable } from '@nrgyjs/rxjs';
import { interval } from 'rxjs';

const scope = createScope();
const timer = fromObservable(interval(1000), 0);

// Добавляем атом в scope для автоматического уничтожения
scope.add(timer);

// Позже, при уничтожении scope, подписка на interval также будет закрыта.
scope.destroy();