【问题标题】:Retry Mechanism Not Actually Triggering the HTTP Call重试机制实际上并未触发 HTTP 调用
【发布时间】:2021-11-10 05:09:03
【问题描述】:

我有以下代码:

    const http$: Observable<Course[]> = this.http.request('/api/courses');

    const courses$ = http$
        .pipe(
            tap(() => console.log('HTTP request invoked ...')),
            map( res => res['payload'] ),
            shareReplay(),
            retryWhen(errors =>
                errors.pipe(
                    tap(() => console.log('Error retry invoked ...')),
                    delayWhen(() => timer(2000)
                )
            )),
            retry(4)
        );

现在,当发生网络故障时,我检查了控制台并发现消息“错误重试调用...”,但是当我检查网络选项卡时,我找不到再次调用的实际 HTTP 请求。

这背后有什么原因吗?

谢谢

【问题讨论】:

  • 可能shareReplay是这里的问题,试试去掉再测试

标签: angular rxjs observable


【解决方案1】:

当您使用 retryWhen 时,您不必添加 retry(4) ,同时删除 shareReplay() 您应该可以看到它重试。

const courses$ = http$
    .pipe(
        tap(() => console.log('HTTP request invoked ...')),
        map( res => res['payload'] ),
        retryWhen(errors =>
            errors.pipe(
                tap(() => console.log('Error retry invoked ...')),
                delayWhen(() => timer(2000)
            )
        )),
    );

【讨论】:

  • 老实说还是同样的问题。仅在没有实际 HTTP 调用的情况下进行日志记录。
  • 理论上它应该可以按预期工作,您可以设置一个简单的代码框来演示您的问题吗?
  • 发现了 http$ observable 的问题,我设置了一个带有信号的控制器,当它失败时自动关闭连接,这就是它没有重试的原因,现在修复了。谢谢。
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多