【发布时间】:2023-03-29 05:50:02
【问题描述】:
我正在尝试实施如下所示的轮询策略:
- 每 X 秒从服务器请求数据
- 如果请求失败,显示错误消息:“错误接收数据,重试尝试N°”... 每 X 秒重试一次,最多重试 Y 次
- 如果重试次数 > Y 则显示错误消息“接收数据时出错,请稍后重试”
目前的代码如下:
polling$ = combineLatest([timer(0, 1000), this._filters]).pipe(
exhaustMap((_) =>
this.noteDataService.getAll().pipe(
retryWhen((error$) =>
error$.pipe(
map((err, i) => ({ err, i })),
tap(({ i }) =>
console.log(`Error receiving data, retry attempt ${i + 1}`)
),
// retry every X seconds for a maximum of Y times
take(5),
delay(1000),
tap({
complete: () =>
console.log("Error receiving data, please try again later"),
})
)
)
)
)
);
问题是在 X 次尝试后它不会停止并再次尝试 X 次......等等。我想我与 combineLatest 运算符中的第一个计时器有关,但我没有看到解决方案,我尝试插入“第一个”运算符,但在第一次失败后轮询不会重新尝试 X 次。
【问题讨论】:
-
combineLatest这里的目的是什么? -
我使用combineLatest过滤数据,可以调用_filters.next()获取查询参数过滤的数据