使用来自另一个http请求的变量的属性执行http请求

时间:2016-12-10 10:23:06

标签: javascript json ajax asynchronous xmlhttprequest

我的问题有点复杂。情况如下:

我有一个功能:

private updateWatchlistTable(name) {
  this._watchlistElements = [];
  this.http.get('http://localhost:8080/getPoints/' + name)
  .subscribe(res => this._watchlistElements = res.json());
}

从服务器下载JSON文件,如下所示: [{"xid":"DP_049908","name":"t10"},{"xid":"DP_928829","name":"t13"},{"xid":"DP_588690","name":"t14"}]

并将其存储在: private _watchlistElements: Array<WatchlistComponent> = []; 变量

就目前而言,一切运作良好。

现在,我有另一项功能:

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

xid变量中下载每个点_watchlistElements的数据。 (仅在这种情况下)"xid": "DP_049908"点的响应如下:

{"value":"32.339264","ts":1476778297100,"xid":"DP_049908"}

有什么问题?

问题是第二个函数getValues()无法执行这些http调用,因为基本上它无法从xid变量中看到_watchlistElements属性。我不是百分百肯定,但我认为这是因为这些呼叫是异步的。第二个函数getValues() - 在执行时 - 无权访问_watchlistElements属性,因为此变量的内容也是从异步请求中下载的。

  

如果我静态地执行此操作,将这些jsons保存在单独的文件中 - 一切正常。

错误如何?

  

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

任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

使用return.then(),在第一个功能满足Promise时调用第二个功能。在第二次调用时使用Promise.all()可返回从.map()调用返回到链式.then()的所有承诺值。

private updateWatchlistTable(name) {
  this._watchlistElements = [];
  // note `return`
  return this.http.get('http://localhost:8080/getPoints/' + name)
  .subscribe(res => this._watchlistElements = res.json());
}

private getValues() {
 let _this = this;
 // note `return`
 return Promise.all(this._watchlistElements
 .map(v => _this.http.get('http://localhost:8080/getValue/' + v.xid)
 .subscribe(res => _this._values = res.json())));
}

updateWatchlistTable(name)
.then(getValues)
// do stuff with `result`
.then(result => console.log(result)) 
.catch(e => console.log(e));