Angular 角度观测值被取消

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

我正在构建一个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);
}
但是,当全局设置更改时,一些可观察对象没有完成或取消了请求。这就是我如何触发对所有当前场景的重新评估:

 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”真的是一种糟糕的做法吗?如果不是,使用它的标准是什么

事实上,他们为什么会被取消?这将有助于回答这个问题。现在还不清楚你所说的“取消”是什么意思,以及你希望他们表现如何。如果有错误,应该捕获它。没有发生错误。据我所知,浏览器(错误地)确定某些观测值可以取消,因为它们不再相关。此时,如果连接仍处于活动状态,浏览器将中止HTTP请求,而且它不会对某些已返回的请求调用
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();
   }
 }