Angular 9 Как мне дождаться выполнения запроса - PullRequest
0 голосов
/ 27 мая 2020
• 1000 возвращает

Как я могу дождаться завершения моего HTTP-запроса без увеличения интервала опроса, может быть, есть другой способ его обработать

Сервис

 constructor(private httpClient: HttpClient) { }

    getConsoleHealth(): Observable<any> {

        return this.httpClient.get(BASE_SERVICE_URL +'/health', {
            headers: headers
        });
    }

    pollConsoleHealth(initialDelay: number, pollInterval: number): Observable<ActuatorHealth> {

        return timer(initialDelay, pollInterval)
            .pipe(

                switchMap(() => this.getConsoleHealth(),
                )
            );
    }

компонент

 loadConsoleHealth(): void {
        this.serviceSubscription = this.service.pollConsoleHealth(0, 4000)
            .subscribe(data => {
                this.consoleHealth = data;
            }, error  => {

            }
            );
    }

Ответы [ 2 ]

1 голос
/ 28 мая 2020

@ AliF50 Спасибо, мне удалось заставить его работать, изменение switchMap на concatMap помогло

 pollConsoleHealth(initialDelay: number, pollInterval: number): Observable<ActuatorHealth> {
        return timer(initialDelay, pollInterval)
            .pipe(
                concatMap(() => this.getConsoleHealth(),
                )
            );
    }
0 голосов
/ 27 мая 2020

В приведенном ниже коде я сделал рекурсивный вызов. При первом вызове он будет учитывать начальную задержку, после этого он будет учитывать только интервал опыления и будет опрашивать после ожидания до периода опыления, но после получения ответа

import { Component, OnInit } from "@angular/core";
import { Observable, of } from "rxjs";
import { delay, switchMap, map, mergeMap } from "rxjs/operators";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit {
  name = "Angular 6";

  ngOnInit() {
    this.pollConsoleHealth(1000, 4000).subscribe();
  }
  getConsoleHealth(): Observable<any> {
    console.log("next Call" + new Date());
    return of("newData").pipe(delay(20000));
  }

  pollConsoleHealth(
    initialDelay: number,
    pollInterval: number
  ): Observable<any> {
    return of([]).pipe(
      delay(initialDelay),
      delay(pollInterval),
      switchMap(() =>
        this.getConsoleHealth().pipe(
          switchMap(res => this.pollConsoleHealth(0, pollInterval))
        )
      )
    );
  }
}

URL-адрес Stackblitz: - https://stackblitz.com/edit/hello-angular-6-vivvvz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...