无法重试 API 调用获取成功事件

Unable to make a retry for API call Getting the success event

我需要使用 fork-join 进行多次 API 调用,如果 API 中的任何一个调用在 3 秒后甚至 API 失败那么我们不应该去订阅。并且重试也应该发生一次重试就是这样 针对以上需求,我是通过以下方式实现的:-

const getPosts = this.api
      .get("/posts/")
      .pipe(catchError(this.getCatchError));
    const getPostsFaliure = this.api.get("/postsasdfs/")
      .pipe(catchError(this.getCatchError));
    ;
    forkJoin(getPosts, getPostsFaliure)
      .pipe(
        retryWhen(err => {
          err.pipe(
            tap(val => console.log(`Value ${val} was too high!`)),
            //restart in 6 seconds
            delayWhen(val => timer(val * 1000))
          );
        })
      )
      .subscribe(res => console.log(res));

getCatcherror 是这样的:-

getCatchError(error) {
    return of(false);
  }

对于上述实施,我得到以下结果:-

[Array(100),false]

它不会出错并且重试对我也不起作用 API 调用只会进行一次,我需要限制它订阅直到 API s 通过如果在至少有一个失败了,我需要去订阅错误的部分。而且我有一个严格的规则,从 rxjs 时使用重试 如何解决这个问题

Stackblitz URL:-https://stackblitz.com/edit/angular-api-call-cpr1hk?file=src/app/app.component.ts

您正在使用 of(false) 将错误切换为有效通知。必须删除它才能调用 retryWhen

  1. 您可以使用显式变量来表示重试尝试。
  2. Return 来自 catchError 块的 throwError(转发错误)或 EMPTY 常量(完成可观察的)。
import { forkJoin, throwError, EMPTY } from 'rxjs';
import { catchError, retryWhen } from 'rxjs/operators';

const getPosts = this.api.get("/posts/");
const getPostsFaliure = this.api.get("/postsasdfs/");
let retry = 0; // max 3 allowed

forkJoin(getPosts, getPostsFaliure).pipe(
  catchError(err => {
    if (retry <= 3) {
      retry++;
      return throwError(err);
    }
    return EMPTY; // <-- complete the observable if max retries reached
  }),
  retryWhen(err => err.pipe(delay(3000)))
).subscribe(res => console.log(res));