RXJS Observable Subscribe不会触发成功和错误的任何场景



这更像是一个问题,而不是解决问题
我想知道是否存在这样的情况:;成功;以及错误";不会被触发。

"/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运算符。

  1. http库的成功取决于状态:200,它不需要message.body存在

  2. 使用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); 
}
});

相关内容

最新更新