我正在构建一个Angular 2 Web应用程序,它向后端发出请求,执行一些计算工作。有些模型,每个模型都有一个关联的度量标准,适用于一组场景。
在处理与后端通信的服务中,我有两种方法:simulateScenario
和handleData
simulateScenario(model: Model, scenarioID: string): Observable<any> {
const modelID = model.id;
let scenario = this.scenariosService.getScenario(modelID, scenarioID);
let metric = this.metricsService.getSelectedMetric(modelID);
let params: URLSearchParams = metric.getMetricParams();
// ...set params...
return this.http.get(this.apiEndpoint + metric.endpoint, {search: params})
.map(res => this.handleData(res, scenario, metric))
.catch((error: any) => {
console.log(error);
return Observable.throw(error.json().error || 'Server error');
});
}
private handleData(res: Response, scenario: Scenario, metric: Metric): void {
const body = res.json();
scenario.feasibility = metric.feasibility(body);
let data = metric.getPlotData(body);
scenario.setData(data);
}
当我更新包含它们的组件中的单个方案时,一切都按预期工作:
addRow(): void {
let newScenario = ...
this.computeService.simulateScenario(this.model, newScenario.id);
.subscribe();
}
但是,当全局设置发生更改时,某些可观察对象无法完成或已取消请求。这就是我如何触发对所有当前场景的重新评估:
onGlobalsChanged(event: any): boolean {
for (let iter = 0; iter < this.scenarios.length; iter++) {
this.computeService.simulateScenario(this.model, this.scenarios[iter].id);
.subscribe();
}
}
无法处理的方案和被取消的请求似乎是随机的,并且取决于首先在后端完成哪些结果。
经过几天试图弄清楚发生了什么事后,我发现Promise是无法解决的。在预感中,我在上面的代码中将Observables转换为Promises,一切似乎都有效。据我了解,这不是一个长期的最佳实践。
所以,我的问题归结为