我的问题有点复杂。情况如下:
我有一个功能:
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'上不存在。
任何帮助都非常感谢!
答案 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));