Повторить наблюдаемый внутри обновления токен подписаться - угловой 4

Если у меня есть служба AuthenticationService для обновления токена и перехватчик, который перехватывает вызовы AuthHttp, проблема заключается в том, что в методе перехватчика при сбое вызова я делаю вызов refreshToken, подписавшись на наблюдаемое, затем, когда я получаю ответ, мне нужно вызвать первый http вызов, который был сделан, и не могу заставить его работать:

refreshToken(): Observable<any>{
    return this.authHttp.get(GLOBAL.apiurl+'/refresh-token',"").map(
            (response) => {
                    let token = response.json() && response.json().token;
                    if (token){
                        console.log('refresh token');
                        localStorage.setItem('token', token);
                        return true;
                    }
                    else{
                        console.log('no token');
                        this.resetLocalStorage();
                        return false;
                    }
                }
    );
}

тогда у меня есть перехватчик для authttp:

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    return this.intercept(super.request(url, options));
  }

intercept(observable: Observable<Response>): Observable<Response> {

    return observable.catch((err, source) => {

      if (this.isUnauthorized(err.status)) {
        //logout the user or do what you want
          this.authService.refreshToken().subscribe(result => {
                    if(!result){
                    }
                    HERE THE FIRST FAILED CALL MUST BE CALLED
                },
                err => {
                }
            );
        if (err instanceof Response) {
          return Observable.throw(err.json().message || 'backend server error');
        }
        return Observable.empty();
      } else {
        return Observable.throw(err);
      }
    })

  }

1 ответ

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

if (this.isUnauthorized(err.status)) {
        //logout the user or do what you want
          this.authService.refreshToken().subscribe(result => {
                    if(!result){
                    }
                    HERE THE FIRST FAILED CALL MUST BE CALLED
                    // your return must be somewhere here
                    return Observable.empty();
                },
                err => {
                    return Observable.throw(err.json().message || 'backend server error');
                }
            );

      } 
Другие вопросы по тегам