RXJS Observable Subscribe 不会触发成功和错误的任何场景
Any Scenario(s) that RXJS Observable Subscribe wont trigger either success and error
这更像是一个问题而不是解决问题。
我想知道是否有没有触发“成功”和“错误”的情况。
对 "/logout"
的 post 调用将导致 Http 状态 return 代码 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% 的时间输出“Finally”。这意味着根本不会触发成功和错误。
是否有可能成功和错误都没有触发。显然 http 状态代码响应是 200 OK。
更新:
@meriton 提供的答案非常有效。
http库的成功取决于Status: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);
}
});
Observable
,一般情况下,都不需要填写或出错。他们可能永远活着,并继续散发价值。
然而,HttpClient
返回的 Observable
是 保证以成功或错误终止(尽管错误可能需要几分钟,以防万一超时)根据响应的 HTTP 状态。 body 的存在与否不影响这一点。如果请求成功,observable 将只发出一个值:响应 body(如果响应 body 不存在,则为 null
)。
我无法重现您所说的“根本没有触发成功或错误”。您可能误解了回调的含义吗?当您提供三个回调进行订阅时,它们的顺序是:
next
回调,接收发出的值
error
回调,它通知 Observable
由于错误 已中止
complete
回调,通知 Observable
已成功完成
混合回调的危险是 RXJS 团队 deprecated 将多个回调作为单独的参数传递给 RXJS 8 中订阅的原因之一。编写代码的未来证明方式是:
this.http.post<any>('/logout', {}).subscribe({
complete: () => {
console.log("Logout successful")
},
error: (error) => {
console.log(error);
}
});
顺便说一句,none 这些回调的意思是“终于”,就像在 try
语句的 finally
子句中一样,在成功和错误的情况下都会执行。如果您想做某事而不管 Observable
是成功完成还是因错误而失败,您可以使用 finalize
运算符。
这更像是一个问题而不是解决问题。
我想知道是否有没有触发“成功”和“错误”的情况。
对 "/logout"
的 post 调用将导致 Http 状态 return 代码 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% 的时间输出“Finally”。这意味着根本不会触发成功和错误。
是否有可能成功和错误都没有触发。显然 http 状态代码响应是 200 OK。
更新: @meriton 提供的答案非常有效。
http库的成功取决于Status: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);
}
});
Observable
,一般情况下,都不需要填写或出错。他们可能永远活着,并继续散发价值。
然而,HttpClient
返回的 Observable
是 保证以成功或错误终止(尽管错误可能需要几分钟,以防万一超时)根据响应的 HTTP 状态。 body 的存在与否不影响这一点。如果请求成功,observable 将只发出一个值:响应 body(如果响应 body 不存在,则为 null
)。
我无法重现您所说的“根本没有触发成功或错误”。您可能误解了回调的含义吗?当您提供三个回调进行订阅时,它们的顺序是:
next
回调,接收发出的值error
回调,它通知Observable
由于错误 已中止
complete
回调,通知Observable
已成功完成
混合回调的危险是 RXJS 团队 deprecated 将多个回调作为单独的参数传递给 RXJS 8 中订阅的原因之一。编写代码的未来证明方式是:
this.http.post<any>('/logout', {}).subscribe({
complete: () => {
console.log("Logout successful")
},
error: (error) => {
console.log(error);
}
});
顺便说一句,none 这些回调的意思是“终于”,就像在 try
语句的 finally
子句中一样,在成功和错误的情况下都会执行。如果您想做某事而不管 Observable
是成功完成还是因错误而失败,您可以使用 finalize
运算符。