处理对象数组时访问HTTP Observable中的对象

时间:2016-05-13 00:12:51

标签: typescript angular rxjs

我需要处理数组的每个元素,为每个元素进行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。目标如下:

  1. 拨打列表中的每个项目
  2. 如果成功标记为成功,则失败为失败
  3. 所有通话完成后更新UI(成功/失败并不重要。)
  4. 上述代码的问题在于,由于“singleData”会更新,因此会推送不正确的值。例如,当订单的第一个对象执行时,“singleData”指向列表的第10个项目而第10个项目而不是第一个。

1 个答案:

答案 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个。