如何按顺序使用RxJS可观察对象?

Thebobblob

达成协议:我有一个HTTP get请求,该请求返回对象的JSON列表。我使用RxJS订阅以接收该列表的数据。现在,对于该列表中的每个对象,我想执行另一个HTTP请求,然后将该请求的结果放入数组中。

到目前为止,我已经能够做到这一点,但似乎无法弄清楚如何维护数据初始列表的顺序。这可能与整个Observable机制是异步的这一事实有关。

这是我的代码:

    ngOnInit(): void {
    this.shiftInformationService.getShifts("2016-11-03T06:00:00Z", "2016-11-06T06:00:00Z")
        .subscribe(shifts => {
            shifts.forEach(shift => {
                this.addDataToAreaChart(shift.startDateTime, shift.endDateTime, shift.description);
            });
        });

}

addDataToAreaChart(startDate: string, endDate: string, description: string) {
    this.machineStatisticsService
        .getCumulativeMachineStateDurations(startDate, endDate)
        .subscribe(s => {
            this.areaChartData = [];
            this.areaChartData.push(new AreaChartData(startDate, endDate, description, s));
        });
}

我想要的是shifts.forEach在推入areaChartData数组中的数据时保持从循环调用的顺序

有任何想法吗?帮助将不胜感激!

更新:已解决!

最终代码:

ngOnInit(): void {
    var startDate = new Date();
    startDate.setDate(startDate.getDate() - 3);

    this.shiftInformationService.getShifts(DateUtil.formatDate(startDate), DateUtil.formatDate(new Date()))
        .subscribe(shifts => {
            Observable.from(shifts)
                .concatMap((shift) => {
                    return this.machineStatisticsService
                        .getCumulativeMachineStateDurations(shift.startDateTime, shift.endDateTime)
                        .map((result) => {
                            return {
                                "addDataToAreaChartValue": result,
                                "shift": shift
                            }
                        });
                })
                .subscribe(s => {
                    this.areaChartData = [];
                    this.areaChartData.push(
                        new AreaChartData(
                            s.shift.startDateTime,
                            s.shift.endDateTime,
                            s.shift.description + ' ' + s.shift.startDateTime.slice(5, 10),
                            s.addDataToAreaChartValue
                        )
                    );
                });
        });
}

感谢迈克尔!

麦可

使用concatMap工艺顺序。

将每个源值投影到一个Observable,将其以合并方式合并到输出Observable中,以序列化的方式等待每个值完成,然后再合并下一个值。

用于map以可观察的方式附加/转换值。

将给定的项目函数应用于源Observable发出的每个值,并将结果值作为Observable发出。

所以,你需要这样做

ngOnInit(): void {
    this.shiftInformationService.getShifts("2016-11-03T06:00:00Z", "2016-11-06T06:00:00Z")
        .subscribe(shifts => {
            Rx.Observable.from(shifts) // create observable of each value in array
                .concatMap((shift) => { // process in sequence
                    return this.addDataToAreaChart(
                        shift.startDateTime, 
                        shift.endDateTime, 
                        shift.description
                    ).map((result) => {
                        return {
                           "addDataToAreaChartValue" : result, // addDataToAreaChart result
                           "shift": shift // append shift object here, so we can access it on subscribe
                        }
                    });
                })
                .subscribe(s => {
                    //this.areaChartData = []; // why??
                    this.areaChartData.push(
                        new AreaChartData(
                            s.shift.startDate, 
                            s.shift.endDate, 
                            s.shift.description, 
                            s.addDataToAreaChartValue
                        )
                    );
                });
        });
}

addDataToAreaChart(startDate: string, endDate: string, description: string) {
    return this.machineStatisticsService
        getCumulativeMachineStateDurations(startDate, endDate);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何强制可观察对象按顺序执行?

RxSwift-如何按顺序链接可观察对象

按顺序在可观察对象中执行

RxJS-如何对异步可观察对象数组使用toArray()?

如何基于模式使用RxJS可观察对象过滤数据

使用RxJS CombineLatest过滤可观察对象?

使用RxJS从订阅返回可观察的对象

RXJS:从承诺创建的串联可观察对象的非顺序行为

如何强制两个可观察对象按期望的顺序按角度执行?

Rx.NET:按顺序组合可观察对象

如何使用可观察的 rxJS 过滤 json

RxJS:仅当订阅了外部可观察对象时,才如何订阅内部可观察对象?

如何将数组的可观察对象转换为可观察对象数组(RxJS)

在rxjs中,如何使用takeUntil或takeWhile取消订阅“内部”“间隔”的可观察对象

使用switchMap RxJS时如何处理可能返回空的可观察对象

使用CombineLatest时如何从链式rxjs可观察对象捕获错误?

Angular如何使用rxjs管道从可观察对象中过滤数据

如何使用rxjs大理石测试发出分组事件的可观察对象?

使用RxJS如何触发另一个动作流的可观察对象

如何“等待” RxJS中的两个可观察对象

RxJs-可观察-如何从JSON对象获取数据

RxJS:如何动态合并可观察对象

使用switchmap和forkjoin链接可观察对象不能按预期的角度打字稿rxjs工作

如何触发可观察的rxjs

如何链接可观察的rxjs

如何使用 rxjs 处理序列可观察量?

如何使用RxJS可观察的订阅调用中的值

稍后如何在 rxjs 可观察流中使用属性?

如何在另一个可观察对象内部解析一个可观察对象?-rxjs