Angular 角度观测值被取消
我正在构建一个Angular 2 web应用程序,它向后端发出请求,后端执行一些计算工作。有一些模型,每个模型都有一个关联的度量,应用于一组场景 在处理与后端通信的服务中,我有两种方法:Angular 角度观测值被取消,angular,request,promise,observable,Angular,Request,Promise,Observable,我正在构建一个Angular 2 web应用程序,它向后端发出请求,后端执行一些计算工作。有一些模型,每个模型都有一个关联的度量,应用于一组场景 在处理与后端通信的服务中,我有两种方法:simulateScenario和handleData simulateScenario(model: Model, scenarioID: string): Observable<any> { const modelID = model.id; let scenario = this
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);
}
但是,当全局设置更改时,一些可观察对象没有完成或取消了请求。这就是我如何触发对所有当前场景的重新评估:
onGlobalsChanged(event: any): boolean {
for (let iter = 0; iter < this.scenarios.length; iter++) {
this.computeService.simulateScenario(this.model, this.scenarios[iter].id);
.subscribe();
}
}
onGlobalsChanged(事件:任意):布尔值{
for(设iter=0;iter
未得到处理的场景和被取消的请求似乎是随机的,取决于哪个结果碰巧首先在后端完成
经过几天的努力想弄清楚到底发生了什么,我发现提到的承诺是不可撤销的。凭直觉,我将上述代码中的可观测值转换为承诺,一切似乎都正常。据我所知,这不是一个长期的最佳实践
所以,我的问题归结为
- 为什么上面的观测值会被取消
- 有没有办法改变我的使用模式,以避免取消?(例如设置“不可取消”选项)
- 使用“toPromise”真的是一种糟糕的做法吗?如果不是,使用它的标准是什么
map
块。然后需要MCVE来复制该问题。欢迎使用小提琴或拨弄乐器。问题本身在复制过程中得到解决并不罕见。您是否正确处理上述代码中的错误并不明显.subscribe()
是问题上下文中最重要的部分,它缺失了。事实上,为什么它们会被取消?这将有助于回答这个问题。现在还不清楚你所说的“取消”是什么意思,以及你希望他们表现如何。如果有错误,应该捕获它。没有发生错误。据我所知,浏览器(错误地)确定某些观测值可以取消,因为它们不再相关。此时,如果连接仍处于活动状态,浏览器将中止HTTP请求,而且它不会对某些已返回的请求调用map
块。然后需要MCVE来复制该问题。欢迎使用小提琴或拨弄乐器。问题本身在复制过程中得到解决并不罕见。您是否正确处理上述代码中的错误并不明显.subscribe()
是问题上下文中最重要的部分,但缺少它。
onGlobalsChanged(event: any): boolean {
for (let iter = 0; iter < this.scenarios.length; iter++) {
this.computeService.simulateScenario(this.model, this.scenarios[iter].id);
.subscribe();
}
}