forEach函数中的Http请求。 Angular2

时间:2016-12-09 14:15:49

标签: javascript angular asynchronous xmlhttprequest

在http请求中使用forEach函数时遇到问题。

我有一个_watchlistElements变量,它包含以下数据:

[{"xid":"DP_049908","name":"t10"},{"xid":"DP_928829","name":"t13"},{"xid":"DP_588690","name":"t14"},{"xid":"DP_891890","name":"t16"},{"xid":"DP_693259","name":"t17"}]

现在,我正在创建一个函数,它将从服务器为每个xid元素下载数据:

private download() {
  this._watchlistElements.forEach(v => 
  this.http.get('http://localhost:8080/getValue/' + v.xid)
  .subscribe(res => this._values = res.json()));
}

必须将数据作为每个v.xid值的对象下载,并将其存储在_values变量中。

private _values: Array<WatchlistComponent> = [];

但不知何故,angular会返回v.xid元素的错误。它没有看到那个变量。但它有点奇怪,因为当我在控制台中执行它时,我的意思是:将json存储在变量中并在此v.xid元素上使用forEach函数,一切正常。

  

[默认] C:\ Users \ src \ app \ appBody \ watchlist \ watchl中的错误   ist.component.ts:51:115   'WatchlistComponent'类型中不存在属性'xid'。

xid存在...但在_watchlistElements内部异步下载数据...

我不是100%确定这种方法是对的,但如果您有任何想法如何解决,请告诉我。

1 个答案:

答案 0 :(得分:0)

打印_values数组时会发生什么?

上述错误是类型错误。 WatchlistComponent接口是什么样的?它是否包含xid属性?

您可以通过覆盖类型...

来解决类型错误
private download() {
  this._watchlistElements.forEach((v as any) => 
  this.http.get('http://localhost:8080/getValue/' + v.xid)
  .subscribe(res => this._values = res.json()));
}

帮助您更好地构建代码。如果你想结合许多Observable的结果,我会使用像forkJoin这样的东西。

private download():void {
  //create an array of Observables
  let el$ = _watchlistElements.map(el => {
    return this.http.get('http://localhost:8080/getValue/' + el.xid)
             .map(res: Response => <any>res.json());
  });

  //subscribe to all, and store the data, el$ is an array of Observables
  Observable.forkJoin(el$).subscribe( data => {
    this._values = data; //data will be structured as [res[0], res[1], ...]
  });
}

HERE是一个使用上述方法的Plunker。 https://plnkr.co/edit/woXUIDa0gc55WJPOZMKh?p=preview

相关:angular2 rxjs observable forkjoin