我有一个 RxJS 序列如下:
(控件是 Angular 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))
}
我做错了什么?
最佳答案
toArray
运算符仅在其源 Observable 完成后才会发出其缓冲区。
在您的情况下,您的源是 control.valueChanges
,它永远不会完成,因此 toArray
永远不会发出任何内容。这取决于您想要实现的目标,但您可以使用 scan()
收集所有排放,同时发送所有中间结果,或者使用 take(1)
作为第一个运算符,确保链在 valueChanges
第一次发出后完成。
关于angular - RxJS toArray 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53819988/