rxjs - RxJs - 将 Observables 数组转换为发射值数组
问题描述
抱歉标题,我想不出更好的标题。
我有这段代码,基本上:
- 过滤有效(非空)cron epressions 的数组
- 将每个 cron 表达式映射到对服务的调用
this.formGroup.valueChanges.pipe(
op.filter(v => !!v.cronExpressions),
op.map((v): string[] => v.cronExpressions),
op.map((v: string[]) => v.map(cron =>
this.cronService.getReadableForm(cron).pipe(
op.map(this.toDescription),
op.map((description): CronExpressionModel => ({ cron, description }))
)
)
),
// What now?
).subscribe((cronExpressions: CronExpressionModel[]) => ...) // Expected result
我想得到所有服务调用返回subscribe()
的数组。CronExpressionModel
我无法解决这个问题。
目前的解决方案,根据马丁的回答:
filter(v => !!v.cronExpressions),
map(v => v.cronExpressions),
map(cronExprs => cronExprs.map(c => this.invokeCronService(c))),
mergeMap(serviceCalls => forkJoin(serviceCalls).pipe(defaultIfEmpty([])))
解决方案
forkJoin
如果您不介意并行运行所有请求,则可以添加:
switchMap(observables => forkJoin(...observables))
或者,如果您想按顺序运行所有这些:
switchMap(observables => concat(...observables).pipe(toArray()))
而不是switchMap
您可能想要使用concatMap
或mergeMap
取决于您想要的行为。
推荐阅读
- node.js - 公共文件夹未使用 react/webpack 编译
- python-3.x - POST 请求在 docker-compose 容器中不起作用
- asp.net-core - 未确认电子邮件的用户仍处于登录状态
- javascript - 要求解决未定义
- reactjs - 如何在路由更改时停止重新渲染组件(通常是返回历史记录)?
- biztalk - 如何从 BizTalk MSMQ 适配器发送的 C# 中的 MSMQ 私有队列接收 xml 消息
- c++ - 类成员变量的初始化顺序
- django - 如何在 save_model 上的 Django 管理员中发送 Firebase 通知
- c - 为什么 C 中的警告指令会引发 LINT 错误?
- c++ - 在 C++ 中的文件的特定行中获取某些值