【问题标题】:RxJS toArray not being calledRxJS toArray 没有被调用
【发布时间】:2018-12-18 01:13:33
【问题描述】:

我有一个 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 =&gt; 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 }))
        )

describeCron 很简单:

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

我做错了什么?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

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

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

    【讨论】:

    • 这很奇怪,马丁,它一直工作到昨天。如果你记得你几天前回答了我的问题stackoverflow.com/questions/53782041/…
    • 可能是因为我用的不是FormGroupvaluesChanges,而是FormControl一个
    • 在我的示例中,我在 concat(...observables).pipe(toArray()) 上使用了 toArray,其中每个 Observable 都是如此服务调用。
    • 是的,但我实际上使用的是 madjaoue 解决方案。而且效果很好。这就是奇怪
    • 用你的方法解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2014-01-18
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多