首页 > 解决方案 > RxJs - 将 Observables 数组转换为发射值数组

问题描述

抱歉标题,我想不出更好的标题。
我有这段代码,基本上:

  1. 过滤有效(非空)cron epressions 的数组
  2. 将每个 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([])))

标签: rxjs

解决方案


forkJoin如果您不介意并行运行所有请求,则可以添加:

switchMap(observables => forkJoin(...observables))

或者,如果您想按顺序运行所有这些:

switchMap(observables => concat(...observables).pipe(toArray()))

而不是switchMap您可能想要使用concatMapmergeMap取决于您想要的行为。


推荐阅读