невозможно использовать обещание в Observable в angular сервисах - PullRequest
0 голосов
/ 02 марта 2020

У меня есть служба wrap-http, которую я использую в качестве оболочки поверх HttpClient. В сервисе wrap-http у меня есть метод

createHeaderOptions

, который получает токен пользователя из сервиса хранилища, добавляет токен в параметры заголовка и возвращает его. Я вызываю этот метод для каждого запроса. В createHeaderOptions AuthService.getLoggedUser () - это обещание, когда я добавляю await и asyn c с AuthService.getLoggedUser (), он выдает ошибку с методами get, put, post, delete и patch, где он находится вызывается в этой же службе, потому что их тип возвращаемого значения Observable. Как я могу справиться с этим?


wrap-http.service.ts

export class WrapHttpService {
  private static async createHeaderOptions(headers) {
    let user = {};
    await AuthService.getLoggedUser()
      .then((result) => {
        user = result;
      });

    if (!_.isEmpty(user)) {
      if (!headers) {
        headers = {};
      }
      headers[`Authorization`] = 'Bearer ' + user[`tokenInfo`];
      headers[`Accept`] = '*/*';
    }

    const httpOptions = {};
    if (headers) {
      httpOptions[`headers`] = new HttpHeaders(headers);
    }
    return httpOptions;
  }

  get(url: string, headers?: object): Observable<any> {
    return this.http.get(url, WrapHttpService.createHeaderOptions(headers));
  }
  post(url: string, data: object, headers?: object): Observable<any> {
    return this.http.post(url, data, WrapHttpService.createHeaderOptions(headers));
  }
  put(url: string, data: object, headers?: object): Observable<any> {
    return this.http.put(url, data, WrapHttpService.createHeaderOptions(headers));
  }
  patch(url: string, data: object, headers?: object): Observable<any> {
    return this.http.patch(url, data, WrapHttpService.createHeaderOptions(headers));
  }
  delete(url: string, headers?: object): Observable<any> {
    return this.http.delete(url, WrapHttpService.createHeaderOptions(headers));
  }
}

Любая помощь здесь будет высоко ценится.

1 Ответ

0 голосов
/ 02 марта 2020

Прежде всего, вы можете использовать для этого HttpInterceptor, а не передавать заголовки вручную. https://angular.io/api/common/http/HttpInterceptor

Если вы хотите сделать это вручную, это может выглядеть следующим образом:

export class WrapHttpService {
  private static createHeaderOptions(headers) {
    return AuthService.getLoggedUser().then((user) => {
        if (!_.isEmpty(user)) {
          if (!headers) {
            headers = {};
          }
          headers[`Authorization`] = 'Bearer ' + user[`tokenInfo`];
          headers[`Accept`] = '*/*';
        }

        const httpOptions = {};
        if (headers) {
          httpOptions[`headers`] = new HttpHeaders(headers);
        }
        return httpOptions;
    });
  }

  get(url: string, headers?: object): Observable<any> {
    return from(this.createHeaderOptions(headers)).pipe(
      switchMap(headers => this.http.get(url, WrapHttpService.createHeaderOptions(headers));)
    )
  }

  /* ... */
}

Объяснение: Перепишите createHeaderOptions, чтобы вернуть обещание. Теперь используйте метод rxjs from для создания наблюдаемого из обещания, затем используйте switchMap для переключения на наблюдаемый объект, который возвращается this.http.get методом

...