Как вернуть значение из функции в которой есть rxjs stream?

Для возврата значения из функции, в которой используется rxjs поток (stream), можно использовать несколько подходов.

1. Использование оператора map и подписка на поток

Один из вариантов - воспользоваться оператором map, чтобы преобразовать значение в потоке и возвратить его в виде Observable. Затем, чтобы получить значение из этого потока, можно подписаться на него вне функции:

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

function getValueFromStream(): Observable<number> {
  // Ваш код с потоком данных
  const stream$ = ...;

  return stream$.pipe(
    map(value => value)
  );
}

// В другой части кода:
getValueFromStream().subscribe(value => {
  console.log(value); // значение будет выведено в консоль
});

2. Использование оператора toPromise() и ключевого слова async/await

Этот подход работает, если вы используете TypeScript и имеете доступ к версии rxjs 6.5.0 или более новой.

import { Observable } from 'rxjs';

async function getValueFromStream(): Promise<number> {
  // Ваш код с потоком данных
  const stream$ = ...;

  return await stream$.toPromise();
}

// В другой части кода
async function main() {
  const value = await getValueFromStream();
  console.log(value);
}

main(); // Вызов функции main

3. Использование Subject или BehaviorSubject

Subject и BehaviorSubject - два основных класса в rxjs. Subject - это просто объект, который является источником данных и может одновременно являться Observable и Observer. BehaviorSubject - это расширение Subject, которое хранит значение и автоматически сообщает новым подписчикам о последнем значении или начальном значении.

import { BehaviorSubject } from 'rxjs';

function getValueFromStream(): BehaviorSubject<number> {
  // Ваш код с потоком данных
  const stream$ = ...;

  const subject$ = new BehaviorSubject<number>(null);

  stream$.subscribe(value => {
    subject$.next(value);
  });

  return subject$;
}

// Использование функции
const value$ = getValueFromStream();
value$.subscribe(value => {
  console.log(value);
});

4. Использование async/await с toPromise() и toPromise() with then()

Этот подход используется, чтобы преобразовать Observable в простой промис и получить значение с помощью async/await или then().

import { Observable } from 'rxjs';

function getValueFromStream(): Observable<number> {
  // Ваш код с потоком данных
  const stream$ = ...;

  return stream$;
}

// Использование функции с async/await
async function main() {
  const value = await getValueFromStream().toPromise();
  console.log(value);
}

main(); // Вызов функции main

// Использование функции с .then() тоже самое
getValueFromStream().toPromise().then(value => {
  console.log(value);
});

Это несколько способов возврата значения из функции, в которой есть rxjs поток. Выбор конкретного подхода зависит от потребностей и особенностей вашего проекта.