角度可观察量被取消

时间:2017-02-03 15:17:56

标签: angular request promise observable

我正在构建一个Angular 2 Web应用程序,它向后端发出请求,执行一些计算工作。有些模型,每个模型都有一个关联的度量标准,适用于一组场景。

在处理与后端通信的服务中,我有两种方法:simulateScenariohandleData

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,一切似乎都有效。据我了解,这不是一个长期的最佳实践。

所以,我的问题归结为

  • 为什么上面的可观测量会被取消?
  • 有没有办法改变我的使用模式,以避免取消? (例如设置'uncancellable'选项)
  • 使用'toPromise'确实是一种不好的做法,如果没有,使用它的标准是什么?

0 个答案:

没有答案