我有一个 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 被调用了 3 次,但 toArray 从未被调用,显然订阅 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/

10-11 11:40