Angular 2 - 检查来自订阅的服务器错误

Angular 2 - Checking for server errors from subscribe

我觉得这个场景应该在 Angular 2 文档中,但我在任何地方都找不到。

场景如下

  1. 提交在服务器上无效的表单(创建对象)
  2. 服务器 returns 一个 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 创建的 success/fail。

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

供参考:

  1. [onNext] (Function): Function to invoke for each element in the observable sequence.
  2. [onError] (Function): Function to invoke upon exceptional termination of the observable sequence.
  3. [onCompleted] (Function): Function to invoke upon graceful termination of the observable sequence.

因此您可以在 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 会在完成时调用,而不管调用的 success/failure 是什么。这在您总是希望在 HTTP 请求之后执行某些逻辑而不管结果如何的情况下可能会有所帮助(即,用于记录目的或某些 UI 交互,例如显示模态)。

Rx.Observable.prototype.finally(action)

Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.

例如,这是一个基本示例:

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
      }
    );

您可以通过以下方式实现

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

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

请注意,从 6.4 开始,以前的回调语法已被弃用,并将在 8.0 中删除。而不是

of([1,2,3]).subscribe(
    (v) => console.log(v),
    (e) => console.error(e),
    () => console.info('complete') 
)

你现在应该使用

of([1,2,3]).subscribe({
    next: (v) => console.log(v),
    error: (e) => console.error(e),
    complete: () => console.info('complete') 
})

https://rxjs.dev/deprecations/subscribe-arguments