rxjs - 内部 observable 发出值后返回源 observable 值
问题描述
在一个可观察的链中,我需要执行一些异步工作,然后将源值返回到下一个可观察的,所以我必须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())
,因为这会导致下一个 observable 在someAsyncWork()
返回之前运行。
虽然我目前的方法有效,但它使代码有些混乱……而且我在代码库的许多地方都重复了这种模式。
pipe(mapTo(no))
问题:无论如何要以更简洁/可读的方式做到这一点?
解决方案
也许最简单的做法是编写自己的可管道操作符。
例如:
const concatTap = <T>(project: (value: T) => Observable<any>) =>
concatMap((value: T) => project(value).pipe(mapTo(value)));
但是,这假设异步操作的 observable 只发出一个值。为了防止发出多个值,您可以执行以下操作:
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
是第一个出现在我脑海中的东西。命名事物是困难的。
推荐阅读
- sql - 如何使用触发器防止在 oracle sql 中插入数据
- javascript - Node.js 快速路由 POST 请求空正文,使用 body-parser
- c - 在尝试释放 C 中数组的已分配内存时,抛出异常说“project.exe 已触发断点”
- javascript - 我的自定义范围脚本的 RegExp 问题
- node.js - 在 Heroku 上启动 node.js 服务器时传递参数很热?
- android - 在 Android Studio 中切换 Activity 后表格移动
- c++ - 将参数推送到调用堆栈的便携式方法 (C++)
- animation - 补间最大值和动画下拉菜单
- javascript - 将图像与 webpack react 一起使用是行不通的
- ruby-on-rails - 回调在 Rails 5 中表现为事务