кэширование данных в сервисе angular - PullRequest
0 голосов
/ 16 апреля 2020

Я написал сервис соглашений и мне нужно получить данные после их получения. В следующий раз он должен проверить данные, если они существуют, и вернуть значение из этой переменной. Я объявил переменную с именем private data: СоглашенияModel []; Как мне это проверить в моем методе обслуживания

@Injectable()
export class AgreementsService {
  private baseUrl: string;
  private data: AgreementsModel[];

  constructor(private http: HttpClient, private appService: AppConfigService, public store: Store) {
    this.baseUrl = this.appService.getAppSettings().apiServer.agreements;
  }


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

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

}

Я пытался сделать следующее, но получаю ошибку компиляции в строке, возвращающей this.data. В типе AgreementModel [] отсутствуют следующие свойства типа Promise.

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

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

1 Ответ

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

Если вы хотите кэшировать его независимо от сеанса браузера, лучшим решением будет использование IndexDB браузера. Я создал службу indexDB для управления ею, но для ее обновления необходимо внести некоторые улучшения, если вы хотите использовать ее в работе.

export class IdbService {
  static STORES = {
    AGREEMENTS: 'agreements'
  };

  async getDb() {
    return await openDB('my-db', 1, {
      upgrade(db) {
        for (const key in IdbService.STORES) {
          const storeName = IdbService.STORES[key];
          if (!db.objectStoreNames.contains(storeName)) {
            db.createObjectStore(storeName);
          }
        }
      }
    });
  }
}

Я изменил сервис для работы с обещаниями. Конечно, вы можете немного изменить его для работы с наблюдаемыми.

export class AgreementsService {
  private baseUrl: string;
  private data: AgreementsModel[];

  constructor(
    private idbService: IdbService,
    private http: HttpClient, 
    private appService: AppConfigService, 
    public store: Store
  ) {
    this.baseUrl = this.appService.getAppSettings().apiServer.agreements;
  }


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

    const key = `outstanding-agreements__${userAgreementId.toString()}`;
    const db = await this.idbService.getDb();

    let result = await db.get(IdbService.STORES.AGREEMENTS, key);
    if (result ?.length) {
      return result ;
    }

    const result = await this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params}).toPromise();

    await db.put(IdbService.STORES.AGREEMENTS, result, key);
    return result;
  }

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