RxJS. Вернуть в потоке параметр и результат.

Задача заключается в том, что необходимо получить как значение из исходного потока, так и резльтат его обработки в другом потоке. Допустим имеется исходный поток source и фукнция возвращая другой поток.

import { of, from, Observable } from "rxjs";
import { map, tap, mergeMap } from "rxjs/operators";

function getHash(value: string): Observable<number> {
  return of(value.length);
}

const source = from(["Hello", "World"]);

Ожидаемый результат:

{ word: "Привет", hash: 6 } 
{ word: "мир", hash: 3 }

Временная переменная

Примитивный подход

let tempWord: string = null;
source.pipe(
  tap(word => (tempWord = word)),
  mergeMap(word => getHash(word)),
  map(hash => ({ word: tempWord, hash }))
);

forkJoin или zip

source.pipe(
  mergeMap(word => forkJoin(of(word), getHash(word))),
  map(([word, hash]) => ({ word, hash }))
);

Вложенная pipe

source.pipe(
  mergeMap(word => getHash(word).pipe(
    map(hash => ({ word, hash })) 
  ))
);

Похожие записи

RxJs Subjects

Выдержки из доклада Андрея Алексеева (Tinkoff) про RxJs (Subject, Behaviour Subject, Replay Subject, Async Subject). Применение в Angular.

RxJS. Delay from array

import { of, from } from 'rxjs'; 
import { map, concatMap, delay } from 'rxjs/operators';

from([2,4,6,8]).pipe(
  concatMap(item => of(item).pipe(delay(1000)))
).subscribe(console.log);