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 })) 
  ))
);

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

Angular. Когда не надо отписываться в RxJS?

В async pipe за вас отпишется Angular. Во всех остальных случаях лучше отписываться самостоятельно. Допускается не отписываться в потоках, где будет гарантировано вызван complete.