HTTP-перехватчик Angular 6 - представление не обновляется после перехвата ошибки и запроса на повторную отправку - PullRequest
0 голосов
/ 06 октября 2018

Я тестирую свою функцию обновления HTTP-маркера HTTP Angular 6 Interceptor по определенному маршруту, как показано ниже.

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

Добавление функции receiveChanges () в вызывающий компонент в вызове http .then () исправит это, но я не хочу добавлять это (или NgZone.run ()) к каждому http-требованию в моемприложение ..

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

   if (req.url === 'XXX') {
        return this.refreshToken().pipe(
            switchMap(() => {
                req = this.addToken(req);
                return next.handle(req);
            })
            , catchError(() => {
                this.authService.signOut();
                return throwError('');
            })
        );
   }
   ...
}

/* Get new google ID token in Auth service and inform when done*/
refreshToken() {
    if (this.refreshTokenInProgress) {
        return new Observable(observer => {
            this.tokenRefreshed$.subscribe(() => {
                observer.next();
                observer.complete();
            });
        });
    } else {
        this.refreshTokenInProgress = true;

        return from(this.authService.refreshToken()).pipe(
           tap(() => {
                this.refreshTokenInProgress = false;
                this.tokenRefreshedSource.next();
            })
        );
    }
}

/* Add google id token to request header */
addToken(request) {
    const token = this.authService.googleIdToken;
    if (token) {
        return request.clone({ headers: request.headers.set('google-id-token', token) });
    }
    return request;
}

1 Ответ

0 голосов
/ 21 октября 2018

Мне наконец-то удалось найти решение на основе этого ответа: Запросы Http, сделанные из состояния Ngxs, не обнаруживаются Angular (проблема, связанная с зоной)

Оберните следующее.обработчик в ngZone run ():

return this._ngZone.run(() => {
  return next.handle(req).pipe(enterZone(this._ngZone));
});

function enterZone<T>(zone: NgZone) {
  return (source: Observable<T>) => {
    return new Observable((sink: Observer<T>) => {
      return source.subscribe({
        next(x) { zone.run(() => sink.next(x)); },
        error(e) { zone.run(() => sink.error(e)); },
        complete() { zone.run(() => sink.complete()); }
      });
    });
  };
}

Я не уверен, почему требуется функциональность enterZone поверх стандартного метода zone.run (), но он помог мне убедиться, что представление было обновлено, когдавозвращение из перехватчика.

...