RxJS toArray没有被调用

时间:2018-12-17 17:09:52

标签: angular rxjs

我有一个RxJS序列,如下所示:
(控件是一个角度FormControl

control.valueChanges.pipe(
    concatMap(cronExprs => from(cronExprs as Array<string>)),
    concatMap(cron => this.invokeCronService(cron)),
    toArray()
).subscribe(cronExprs => this.setCronExpressionModels(cronExprs))

假设cronExprs数组具有三个项['..', '..', '..']。我可以看到,在调试时,concatMap(cron => this.invokeCronService(cron)) clojure被调用了三次,但是toArray从未被调用,并且显然也从未调用subscribe clojure。似乎序列未正确完成。

invokeCronService是:

private readonly invokeCronService =
    (cron: string): Observable<CronExpressionModel> =>
        this.cronService.describeCron(cron).pipe(
            map(result => result.get()),
            map((description): CronExpressionModel => ({ cron, description }))
        )

describeCron很简单:

public describeCron(cronExpression: string): Observable<Result<string>> {
    return of(Result.valid('', cronExpression))
}

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

toArray运算符仅在其源Observable完成后才发出其缓冲区。

在您的情况下,您的来源是control.valueChanges,它从未完成,因此toArray将永远不会发出任何东西。这取决于您要实现的目标,但是您可以使用scan()收集所有排放量,同时保留所有中间结果,或使用take(1)作为第一个运算符,以确保从{{ 1}}。