我需要处理数组的每个元素,为每个元素进行HTTP调用,并且需要跟踪每个调用的HTTP调用的状态,并在一切完成时更新UI。目前我有以下代码
for (var singleData of this.someData) {
this._Service.call(singleData.someData).subscribe(
data=> {
this.successGroups.push(singleData);
this.checkState();
},
error=> {
this.failureGroups.push(singleData);
this.checkState();
}
)
}
this._Service是一个简单的服务,它进行Angular2 HTTP调用并返回observable。目标如下:
上述代码的问题在于,由于“singleData”会更新,因此会推送不正确的值。例如,当订单的第一个对象执行时,“singleData”指向列表的第10个项目而第10个项目而不是第一个。
答案 0 :(得分:2)
你关闭了,但我建议采用一种稍微不同的方法 - 这就是:
// Observable.from() takes an array-like value and emits for each element
let requests$ = Observable.from(this.someData)
.flatMap(singleData => this._Service.call(singleData.someData);
requests$.subscribe(
data => {
this.successGroups.push(singleData);
this.checkState();
},
error => {
this.failureGroups.push(singleData);
this.checkState();
}
);
一般来说,我对这些事情建模的目标是尽量减少我创建的Observable和(特别是)订阅的数量。在您当前的方法中,您要创建每个 n (其中 n 是someData
数组的长度),而使用此方法,您可以&# 39;每个只创造1个。