Сохранение результата наблюдаемого в переменную - PullRequest
0 голосов
/ 16 апреля 2020

Я написал сервис, который возвращает наблюдаемое. Мне нужно инициализировать переменную данных в методе обслуживания. Как мне это сделать

 private data: any;

   public getOutstandingAgreements(userAgreementId?: number): Observable<AgreementsModel[]> {
    let params = new HttpParams();
    if (userAgreementId) {
      params = params.set('userAgreementId', userAgreementId.toString());
  }

   if (this.data) {
    return this.data;
  }
   return this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params});

  }

Я попробовал следующее, но это не сработало

 public getOutstandingAgreements(userAgreementId?: number): Observable<any> {
    let params = new HttpParams();
    if (userAgreementId) {
      params = params.set('userAgreementId', userAgreementId.toString());
  }

   if (this.data) {
    return this.data;
  }
   return this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params})
                                                                .pipe(map((x) => {this.data = x; }));

  }

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

попробуйте добавить return x; в вашу функцию .map. Попробуйте это:

return this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params})
  .pipe(tap((x) => {this.data = x; return x; }));
0 голосов
/ 16 апреля 2020

вы можете использовать кран:

return this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params})
    .pipe(tap((x) => {this.data = x; }));

, и вам нужно, чтобы ваш API был согласованным, поэтому используйте of, чтобы вернуть сохраненные данные:

if (this.data) {
  return of(this.data);
}

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

private data$: Observable<AgreementsModel[]>;

public getOutstandingAgreements(userAgreementId?: number): Observable<AgreementsModel[]> {
  let params = new HttpParams();
  if (userAgreementId) {
      params = params.set('userAgreementId', userAgreementId.toString());
  }

  if (!this.data$) {
    this.data$ = this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params}).pipe(shareReplay(1));
  }
  return this.data$
}
0 голосов
/ 16 апреля 2020

Вы можете сделать:

return this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params})
  .pipe(tap((x) => {this.data = x; }));

Настройка переменной не будет вызвана, пока вы не подпишетесь на нее.

this.getOutstandingAgreements(...).subscribe()

С этим вариантом использования, возможно, Promise будет работать лучше

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