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 提供的答案非常有效。

  1. http库的成功取决于Status: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); 
        }
      });

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