2016-05-13 55 views
1

我需要处理数组中的每个元素,为每个元素进行HTTP调用,并且需要跟踪每个调用的HTTP调用状态并在所有事情完成时更新UI。目前我有以下代码访问HTTP内部的对象Observable处理数组时对象数组

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一旦所有呼叫完成(成功/失败是无关紧要的。)

上述代码的问题在于,由于“singleData”被更新,所以推送的值不正确。例如,当列表中第一个对象被执行的时候,“singleData”指向列表的第10个项目,而第10个项目取而代之。

+0

一个破解就是将singleData对象传入服务调用中,并将其附加到响应中。不喜欢这种方法寿。 –

+0

这与Observables或Angular或其他任何东西无关。这是经典的函数内循环封闭问题。尝试“为(让)”。 – 2016-05-16 03:37:05

回答

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(); 
    } 
); 

一般情况下,我在模拟这些东西目标是尽量减少观测量和数量(尤其是)我创建的订阅。在目前的方法中,您正在创建各自的n(其中n是您的someData数组的长度),而使用此方法时,您只创建每个数组的1个。