内部观察值发出值后返回源观察值

时间:2018-07-09 01:30:51

标签: rxjs

在一个可观察的链中,我需要执行一些异步工作,然后将源值返回到下一个可观察的对象,因此在异步工作之后我不得不pipe(mapTo(x))

更完整的示例:

// fake async work with just 1 null value
someAsyncWork = () => of(null)

of('1', '2', '3').pipe(
  // some async work
  concatMap(no => someAsyncWork().pipe(mapTo(no))),
  concatMap(no => `Some async work [${no}] done!`)
).subscribe(message => console.log(message))

我不能使用tap(no => someAsyncWork()),因为这将导致下一个可观察的对象在someAsyncWork()返回之前运行。

虽然我目前的方法可行,但它会使代码有些混乱……而且我在代码库的许多地方都重复了这种模式。

问题:无论如何,如果没有pipe(mapTo(no)),是否以更简洁/更易读的方式进行?

1 个答案:

答案 0 :(得分:1)

也许最简单的方法是编写自己的管道运算符。

例如:

const concatTap = <T>(project: (value: T) => Observable<any>) =>
  concatMap((value: T) => project(value).pipe(mapTo(value)));

但是,假设异步操作的可观察值仅发出一个值。为了防止发出多个值,您可以执行以下操作:

const concatTap = <T>(project: (value: T) => Observable<any>) =>
  concatMap((value: T) => concat(project(value).pipe(ignoreElements()), of(value)));

您可以像这样使用concatTap

of('1', '2', '3').pipe(
  concatTap(() => someAsyncWork()),
  concatMap(no => `Some async work [${no}] done!`)
).subscribe(message => console.log(message));

我确定您可以选择比我更好的名字。 concatTap是突然出现在我脑海中的第一件事。命名很难。