Angular 7 опрашивает / получает от API каждый интервал для кода ответа - PullRequest
0 голосов
/ 16 апреля 2019

Я делаю интерфейс GUI для API. Одним из шагов в этом инструменте является опрос приложения для многофакторной аутентификации и т. Д. Я не занимаюсь этим.

Я пытаюсь создать функцию Angular 7, которая опрашивает или вызывает этот HTTP GET /getmfa API каждые 5 секунд, пока MFA не пройдет и API не выдаст мне JSON.

У меня проблемы с получением интервала на работу. Интернет полон противоречивой информации о версиях RxJS и синтаксисе .pipe. Я использую RxJS 6+ и Angular 7

Сначала я попытался заставить интервал работать

    poll(apiUrl: string, options?: any): Observable<any> {
        let url = apiUrl;
        let headers = new HttpHeaders({
            'Content-Type': 'application/json',
        });
        let httpOptions = {
            headers: headers,
            withCredentials: true,
        };

        return interval(5000).pipe(map(() => {
            return this.http.get(url, httpOptions)
                .pipe(
                    map(
                        (data) => {
                            console.log('polling...');
                            console.log(data);
                            return data;
                        },
                        error => {
                            console.log('Error:', error);
                        }
                    )
                )
        }));

Даже тайм-аут не работает, но это не то, чего я хочу в любом случае.

    poll(apiUrl: string, options?: any): Observable<any> {
        let url = apiUrl;
        let headers = new HttpHeaders({
            'Content-Type': 'application/json',
        });
        let httpOptions = {
            headers: headers,
            withCredentials: true,
        };
        setTimeout(() => {
            return this.http.get(url, httpOptions)
            .pipe(
                (data) => {
                    return data;
                }
            )
          }, 5000);

Что я делаю не так?

1 Ответ

0 голосов
/ 22 июля 2019

Я думаю, вам нужно SwitchMap между вашим наблюдаемым интервалом и наблюдаемым http.

  return interval(5000).pipe(
      switchMap(counter => {
        return this.http.get(ulr, httpOptions)
          .pipe(
            catchError(error => this.handleError(error)
            )
          );
      })
    );
...