Как найти или добавить элементы в / в массив Obersavble типа Angular и rx js? - PullRequest
1 голос
/ 29 апреля 2020

Пользователь может загружать компании на id через CompanyService. Поскольку компания не будет меняться в течение всего срока службы приложения, я подумал, что имеет смысл кэшировать все уже загруженные элементы и загружать новые только при необходимости.

Теперь я пришел к этому решению, которое работает с использованием локальный Array<Company> в качестве кеша. Он возвращает of() найденного элемента, а альтернативный загружает новый и сохраняет его в кэше.

export class CompanyService {
  private cache: Array<Company> = [];
  private path: string = '';

  getById(id: number): Observable<Company> {
    const company = this.cache.find(item => item.id === id);

    if (company) {
      return of(company);
    }

    return this.http.get<any>(this.path + id).pipe(
      map(response => {
        this.cache.push(response);
        return response;
      }),
      catchError(error => {
        return of(null);
      })
    );
  }
}

Это правильный способ сделать это?

Я думал, что это может было бы лучше использовать что-то вроде:

private cache$: Observable<Array<Company>>;

Но я не знаю:

  • ... это лучший подход?
  • ... как добавить новый предмет?
  • … как найти предмет в этом Observable и вернуть новый в противном случае?

1 Ответ

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

Что бы я сделал: предоставление этой услуги в root, в первую очередь. Начните с возвращения наблюдаемого, если нужно вернуть его.

@Injectable({
  providedIn: 'root'
})
export class CompanyService {
  private cache:Company[] = [];
  private path: string = '';

  getById(id: number): Observable<Company> {
    return new Observable(subs=>{
      const company = this.cache.find(item => item.id === id);
      if(!company){
        this.http.get<Company>(this.path + id).subscribe(result=>{
          this.cache.push(result);
          subs.next(result);
        });
      } else {
        subs.next(company);
      }
    });
  }
}

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

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