当 observable 花费更多时间时不调用 switchMap 的订阅
Subscription for switchMap not called when observable takes more time
startPolling() {
timer(1, 5000).pipe(
switchMap(() => this.gatewayService.get(this.id)),
retry(),
share(),
takeUntil(this.stopPolling)
).subscribe((gateway) => {
this.status = gateway.status;
this.stopPollingIfImageDownloaded();
});
如果 gatewayService.get 调用超过 5 秒,上述代码中的订阅将不起作用。
所以 switchMap 取消了上一个订阅。
这个问题的任何解决方案。
基本上我想轮询状态,调用可能需要时间
您可以使用 mergeMap
或 exhaustMap
。
区别在于:
mergeMap
将每 5 秒订阅一次,而不会取消订阅(取消)之前的 API 调用。这意味着您可以有多个并发订阅。
exhaustMap
不会再次订阅,除非当前的 API 调用已经完成,但它也不会取消 运行 API 调用。在这种情况下,您可能需要在成功响应后最多等待 5 秒,直到 re-subscribes.
startPolling() {
timer(1, 5000).pipe(
switchMap(() => this.gatewayService.get(this.id)),
retry(),
share(),
takeUntil(this.stopPolling)
).subscribe((gateway) => {
this.status = gateway.status;
this.stopPollingIfImageDownloaded();
});
如果 gatewayService.get 调用超过 5 秒,上述代码中的订阅将不起作用。 所以 switchMap 取消了上一个订阅。
这个问题的任何解决方案。
基本上我想轮询状态,调用可能需要时间
您可以使用 mergeMap
或 exhaustMap
。
区别在于:
mergeMap
将每 5 秒订阅一次,而不会取消订阅(取消)之前的 API 调用。这意味着您可以有多个并发订阅。exhaustMap
不会再次订阅,除非当前的 API 调用已经完成,但它也不会取消 运行 API 调用。在这种情况下,您可能需要在成功响应后最多等待 5 秒,直到 re-subscribes.