RxJS toArray 未被调用

Lpp*_*Edd 4 rxjs angular

我有一个 RxJS 序列如下:(
控制是一个 Angular FormControl

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

假设 cronExprs 数组有三个项目['..', '..', '..']。我可以看到,在调试时,concatMap(cron => this.invokeCronService(cron))clojure 被调用了 3 次,但从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 }))
        )
Run Code Online (Sandbox Code Playgroud)

describeCron 是一个简单的:

public describeCron(cronExpression: string): Observable<Result<string>> {
    return of(Result.valid('', cronExpression))
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

mar*_*tin 8

toArray只有在其源 Observable 完成后,操作符才会发出其缓冲区。

在您的情况下,您的来源control.valueChanges永远不会完成,因此toArray永远不会发出任何内容。这取决于您想要实现的目标,但您可以scan()在汇出所有中间结果的同时收集所有排放,或者take(1)用作第一个运算符,以确保链在从 的第一次排放后完成valueChanges