【问题标题】:Rxjs interval is not polling observable server API callRxjs 间隔不轮询可观察的服务器 API 调用
【发布时间】:2020-05-16 02:49:13
【问题描述】:

我正在尝试轮询对我的后端的 API 调用。这个想法是服务器将发送一个 202 错误,直到它完成处理一个作业,并且在这么多请求之后将返回一个 200 和一些结果。我不希望错误杀死流。 API 调用只进行一次。

"rxjs": "~6.4.0", "@angular/core": "~8.2.14"

启动代码:

     onSubmit() {
    return this.scraperService.postUrl(this.form.value.url)
      .pipe(
        switchMap( val => {
          return this.scraperService.pollUntilTaskFinished(val);
        })
      ).subscribe( val => console.log(val))
  }

服务代码:

     postUrl(url: string): Observable<any> {
    return this.http.post('/api/start', {url})
      .pipe(
        map((res: { jobId: string }) => {
          if (res.jobId) {
            return res.jobId;
          }
        }));
  }
  pollUntilTaskFinished(jobId): Observable<any> {
        return interval(2000)
          .pipe(
            switchMap(() => this.http.get(`/api/results/${jobId}`)))
          .pipe(
            catchError(err => this.handleError(err)),
            map(res => console.log(res)));
      }
   handleError(data: HttpErrorResponse) {
    if (data.status === 202) {
      return of('continue');
    }
  }

如何确保间隔重复,直到获得 200 和所需的 JSON?

【问题讨论】:

    标签: rxjs angular8 rxjs6


    【解决方案1】:

    如果您不想处置链,则必须在错误传播到主链之前捕获错误。这意味着在switchMap() 中捕获它:

    this.http.get(`/api/results/${jobId}`))
      .pipe(
        catchError(err => this.handleError(err)),
      )
    

    【讨论】:

    • 你是绝对正确的,错误发生在服务器上并且没有被捕获。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多