2017-02-08 18 views
7

我觉得这种情况应该在Angular 2文档中,但我无法在任何地方找到它。Angular 2 - 检查订阅服务器错误

这里的情景

  1. 提交表单(创建对象)是在服务器上无效
  2. 服务器返回一个错误,一个400错误的请求我以后的形式
  3. 上显示的订阅回来,我想检查一个错误变量或东西(即如果没有错误>然后路由到新创建的详细信息页)

我想象它的工作原理是这样的:

this.projectService.create(project) 
    .subscribe(
     result => console.log(result), 
     error => { 
      this.errors = error 
     } 
    ); 
} 

if (!this.errors) { 
    //route to new page 
} 

我对Angular 2非常陌生,所以这可能来自于我对Observable的工作原理缺乏了解。我没有在窗体上显示这些数据的问题,但无法弄清楚如何在ts组件中看到它。我真的只想检查http创建的成功/失败。

回答

24

正如在相关的RxJS文档中所述,如果没有错误,.subscribe() method可以接受第三个在完成时调用的参数。

参考:

  1. [onNext]Function):功能调用在可观察到的序列中的每个元素。
  2. [onError]Function):在可观察序列异常终止时调用的函数。
  3. [onCompleted]Function):在可观察序列的正常终止时调用的函数。

因此,你可以处理你的路由逻辑在onCompleted回调,因为它会在正常终止(这意味着不会有任何错误,当它被调用)被调用。

this.httpService.makeRequest() 
    .subscribe(
     result => { 
     // Handle result 
     console.log(result) 
     }, 
     error => { 
     this.errors = error; 
     }, 
    () => { 
     // 'onCompleted' callback. 
     // No errors, route to new page here 
     } 
    ); 

作为一个方面说明,也有.finally() method被称为上完成,无论呼叫的成功/失败的。这对于那些总是希望在HTTP请求后执行某些逻辑而不考虑结果(即用于记录目的或用于某些UI交互(如显示模式))的情况可能会有所帮助。

Rx.Observable.prototype.finally(action)

调用可观察序列正常或异常终止源之后的指定的操作。

举例来说,这里是一个基本的例子:

import { Observable } from 'rxjs/Rx'; 
import 'rxjs/add/operator/finally'; 

// ... 

this.httpService.getRequest() 
    .finally(() => { 
     // Execute after graceful or exceptionally termination 
     console.log('Handle logging logic...'); 
    }) 
    .subscribe (
     result => { 
     // Handle result 
     console.log(result) 
     }, 
     error => { 
     this.errors = error; 
     }, 
    () => { 
     // No errors, route to new page 
     } 
    ); 
+1

出所有我发现关于观测的错误处理问题的答案实现的,这是最好的。谢谢 –

1

您可以通过以下方式

this.projectService.create(project) 
    .subscribe(
     result => { 
     console.log(result); 
     }, 
     error => { 
      console.log(error); 
      this.errors = error 
     } 
    ); 
} 

if (!this.errors) { 
    //route to new page 
}