Angular 2 - 检查来自订阅的服务器错误
Angular 2 - Checking for server errors from subscribe
我觉得这个场景应该在 Angular 2 文档中,但我在任何地方都找不到。
场景如下
- 提交在服务器上无效的表单(创建对象)
- 服务器 returns 一个 400 错误的请求,我在表单上显示错误
- 订阅返回后,我想检查一个错误变量或其他东西(即,如果没有错误 > 然后路由到新创建的详细信息页面)
我想象它是这样工作的:
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 可以采用第三个参数,如果没有错误则在完成时调用。
供参考:
[onNext]
(Function
): Function to invoke for each element in the observable sequence.
[onError]
(Function
): Function to invoke upon exceptional termination of the observable sequence.
[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')
})
我觉得这个场景应该在 Angular 2 文档中,但我在任何地方都找不到。
场景如下
- 提交在服务器上无效的表单(创建对象)
- 服务器 returns 一个 400 错误的请求,我在表单上显示错误
- 订阅返回后,我想检查一个错误变量或其他东西(即,如果没有错误 > 然后路由到新创建的详细信息页面)
我想象它是这样工作的:
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 可以采用第三个参数,如果没有错误则在完成时调用。
供参考:
[onNext]
(Function
): Function to invoke for each element in the observable sequence.[onError]
(Function
): Function to invoke upon exceptional termination of the observable sequence.[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')
})