使用 retrywhen RxJs 时如何更新源

How to update the source when use retrywhen RxJs

我正在向 API 发出创建订单的请求,尝试使用相同代码创建订单时可能出错,因为方法 generateCode() 是一个随机生成器!

执行重试时,它使用相同的源,这意味着,在请求中使用相同的代码,它不会再次调用使用新代码创建新订单的方法 sendRequest()!

很遗憾,我无法更改generateCode() 方法来获取不重复代码!我必须使用这种方法来生成随机代码!

this.sendRequest()
      .pipe(
        this.retryStrategy(),
        tap((response) => {
          ...
        }),
        catchError((error) => {
          return EMPTY;
        })
      ).subscribe();

sendRequest(): Observable<any> {
    let order = {
       code: generateCode()
    };
    return this.service.createOrder(order);
  }

retryStrategy(delayDurationMs: number = 1000, maxRetryAttempts: number = 3) {
    return (src: Observable<any>) => src.pipe(
      retryWhen((errors: Observable<any>) => errors.pipe(
        mergeMap((error, i) => {
          const retryAttempt = i + 1;
          console.log('%c retryAttempt: ' + retryAttempt, 'background: #fff; color: red');

          if (maxRetryAttempts > retryAttempt) {
            return timer(delayDurationMs);
          }

          return throwError(error)
        }),
        finalize(() => console.log('%c retry process has done!', 'background: #222; color: #bada55'))
      ))
    )
  }

尝试在你的sendRequest方法中使用defer进行扭曲,每次重试

时应该重新运行
sendRequest(): Observable<any> defer(()=>{
    let order = {
       code: generateCode()
    };
    return this.service.createOrder(order);
  })