Rx js интервал не опрашивает наблюдаемый серверный вызов API - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь опросить вызов API для моего бэкэнда. Идея состоит в том, что сервер будет отправлять ошибку 202 до тех пор, пока не завершит обработку задания, а после стольких запросов вернет 200 с некоторыми результатами. Я не хочу, чтобы ошибка убила поток. Вызов API выполняется только один раз.

"rx js": "~ 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, который мне нужен?

1 Ответ

1 голос
/ 01 февраля 2020

Если вы не хотите избавляться от цепочки, вам придется перехватить ошибку, прежде чем она распространится на основную цепочку. Это значит поймать его внутри switchMap():

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