这更像是一个问题,而不是解决问题
我想知道是否存在这样的情况:;成功;以及错误";不会被触发。
对"/logout"
的post调用将导致Http状态返回代码200具有预期的空响应体
import { httpClient } from angular/common/http;
private http: HttpClient;
this.http.post<any>('/logout', {})
.subscribe(
() => {
console.log("Logout");
}, error => {
console.log(error);
},
() => {
console.log("Finally");
});
它将输出";最后;100%的时间。这意味着成功和错误根本不会被触发。
是否存在成功和错误都不会触发的可能性。很明显,http状态代码的响应是200 OK
更新:@meriten提供的答案非常好。
Observable
通常不需要完成或出错。它们可能永远活下去,并继续散发价值。
但是,HttpClient
返回的Observable
保证根据响应的HTTP状态以成功或错误终止(尽管在超时的情况下错误可能需要几分钟(。身体的存在或不存在并不影响这一点。如果请求成功,可观察对象将只发出一个值:响应体(如果没有响应体,则为null
(。
我无法重复你的说法,即";成功或错误根本不被触发";。你可能误解了回调的意思?当你提供三个回调订阅时,它们按顺序是:
next
回调,它接收发出的值error
回调,通知Observable
由于错误而中止complete
回调,通知Observable
已成功完成
混合回调的危险是RXJS团队不赞成将几个回调作为单独的参数传递到RXJS 8中进行订阅的原因之一。编写代码的经得起未来考验的方法是:
this.http.post<any>('/logout', {}).subscribe({
complete: () => {
console.log("Logout successful")
},
error: (error) => {
console.log(error);
}
});
顺便说一句,这些回调都不意味着";最后";,如在try
-语句的finally
子句中,该语句在成功和错误的情况下都执行。如果要执行某些操作,而不管Observable
是成功完成还是失败并出现错误,都可以使用finalize
运算符。
-
http库的成功取决于状态:200,它不需要message.body存在
-
使用RXJS管道流的示例代码,其中可以通过捕获成功来控制流&错误,控制超时。它还演示了如何使用.subscribe((方法作为经典的Finally
示例RXJS流:
this.http
.post<any>('/logout',{})
.pipe(
map(() => { // OK
return { success: true, err: null };
}),
timeout(10000), // CONTROL TIMEOUT
catchError((e) => { // IN CASE OF ERROR
return of({success: false, err:e});
})
)
.subscribe((result) => { // FINALLY here
if (result.success) {
console.log('Logged out successfully');
} else {
console.log('Logout failed', result.err);
}
});