angular - 在 Angular 9 中失败时如何重试订阅?

标签 angular rxjs observable subscription angular9

上下文: 使用 Angular 9。我正在尝试等待后端可以接收请求。同时它不是,有一个进度条加载。

问题:后台还未可用时,订阅立即失败,进入方法.subscribe()的(error)回调函数,with类似于 http://localhost:5555/api/info: 504 Gateway Timeout 的 Http 失败响应

我做了一些研究,我发现的示例修改了存在 httpClient.get 的服务类,以重试 x 次请求,但我不能这样做,因为ts 服务是自动生成的。

我的第一个想法是使用 while() 循环和一个标志,因此每次执行 (error) 时,标志都将为 false,然后重试订阅。但它会导致内存泄漏。

checkIfBackendAvailable() {
    var backendAvailable = false;
    while(!backendAvailable){
      let subscription = this.infoService.getInfo().subscribe(
      (info) => {
        if (info) {
            backendAvailable = true;
            this.progressBarValue = 100
            // do somethings
         }
       }
        ,
        (error) => {
          clearTimeout(this.infoTimeOut);
          this.showMessage("back-end not available");
          this.stopLoadingBar();
          //do somethings
        }
      );
    }

    this.infoTimeOut = setTimeout(() => {
      if (!backendAvailable) {
        subscription.unsubscribe()
        this.showMessage("error");
        this.stopLoadingBar();
      }
    }, 120000);
  }

最佳答案

只要您的服务函数返回 Observable,您仍然可以使用 retryretryWhen 可观察运算符。

使用重试:

this.infoService.getInfo()
  .pipe(
     retry(3), // you retry 3 times
     delay(1000) // each retry will start after 1 second,
  )
  .subscribe(res => {
     // success
  })

使用retryWhen:

this.infoService.getInfo()
  .pipe(
     retryWhen(errors => errors.pipe(
         // define conditions for retrying with some of observable operators
     )),
  )
  .subscribe(res => {
     // success
  })

关于angular - 在 Angular 9 中失败时如何重试订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63113192/

相关文章:

html - 如何在使用 Angular 2 通过 webkitspeech 录制时动态地将文本添加到文本区域?

css - 覆盖默认应用程序图标(SVG 或 Fonticon?)

typescript - RxJs Array of Observable 到 Observable of Array

javascript - Angular2 路由守卫返回 Observable<bool>,如何处理错误

angular - 使用 RxJS 将初始流与修改流结合起来

javascript - 如何从一个本地 ionic 服务器到另一台 Express 本地服务器进行 API 调用

json - Angular 4 HTTP 不返回 JSON 正文

javascript - 如何访问中继器内的外部元素?

angularjs - 在基类中使用依赖项而不必从继承类传递此依赖项

JavaScript如何将数组属性提取到另一个数组中?