在一个可观察的链中,我需要执行一些异步工作,然后将源值返回到下一个可观察的对象,因此在异步工作之后我不得不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))
,是否以更简洁/更易读的方式进行?
答案 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
是突然出现在我脑海中的第一件事。命名很难。