【发布时间】:2019-09-15 06:20:37
【问题描述】:
我有多个从 MySQL 数据库获取 JSON 数据的 http 帖子。我想要一个函数来监听所有这些,并在它们全部返回已收到数据后运行下一段代码。
我尝试了 async with await 的多种变体,但该函数似乎没有等待 HTTP 发布完成。
例如,我有一个风险服务 risk.service.ts 来获取 riskTable:
getRiskTable(): Observable<Risk[]> {
return this.http.get(`${this.baseUrl}/getRiskTable`).pipe(
map((res) => {
this.riskTable = res['data'];
return this.riskTable;
}),
catchError(this.handleError));
}
在我的仪表板上,我称之为代码:
getRiskTable():any {
return this.riskService.getRiskTable().subscribe(
(res: []) => {
this.riskTable = res; // the value is correctly captured here
return true;
},
(err) => {
this.error = err;
}
);
}
然后是运行多个这些函数的异步函数,理论上它应该等到所有函数完成然后记录值。但是由于某种原因,全局变量 this.riskTable 在这个函数中是未定义的。
async getAllData(){
let riskTable = await this.getRiskTable();
let risks = await this.getAllRisks();
console.log(riskTable); //This returns stuff
console.log(risks);
console.log(this.riskTable); //This returns undefined even though it was set in getRiskTable
}
请任何指点 - 我对角度非常陌生,而且它的复杂性让我完全难过。 2 天和 100 倍的变化让这个工作我慢慢失去了我的香蕉!
【问题讨论】:
-
你可以考虑
forkJoin,它是并行运行的(如果没有相互依赖的话),在回调中你可以对数据做任何你需要做的事情。 -
好吧,我快速浏览了 forkJoin 的发现和示例。他们在服务中运行它以获取所有 HTTP 请求,然后返回结果。我有多个 HTTP 调用需要保持模块化。我想从各种组件中一一调用它们,因此我希望组件能够从服务访问数据并等待它们完成(并行将是理想的,但我会采取任何措施此时)。
标签: angular asynchronous listener