angular - RxJS toArray 未被调用

标签 angular rxjs

我有一个 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/

相关文章:

javascript - angular2 rxjs Observable - 提供的参数不符合调用目标的签名

angular - 使用 angular 2 样式绑定(bind)绑定(bind) rgb 颜色值

java - 请求的资源上不存在 'Access-Control-Allow-Origin' header 。错误

javascript - rxjs处理ajax请求

javascript - RxJs 管道和可出租运算符 `map` : 'this' context of type 'void' is not assignable to method's 'this' of type 'Observable<{}>'

angular - 如何将 ngclass 绑定(bind)到一个可观察值

angular - 如何防止垫子膨胀板关闭?

angular - ios 模拟器中出现 ionic /Angular FileReader 错误(addEventListener 不是函数)

javascript - Angular 2读取输入文件

javascript - RxJS 数组(map)数据变化时如何更新?