Как избежать дублирования методов в angular сервисах - PullRequest
0 голосов
/ 17 марта 2020

Есть ли способ избежать написания одного и того же кода в каждой службе.

У меня есть несколько служб для разных конечных точек API:

  getLecturesData(orderBy?: string, orderDirection = 'asc', page = 1, pageSize = 10): Observable<LecturesData> {
    let params = new HttpParams();
    params = params.set('order_direction', orderDirection);
    params = params.set('page', page.toString());
    params = params.set('page_size', pageSize.toString());
    if (orderBy) { params = params.set('order_by', orderBy); }

    return this.http.get<LecturesData>('/api/lectures', {params});
  }
  getStudentsData(orderBy?: string, orderDirection = 'asc', page = 1, pageSize = 5): Observable<StudentsData> {
    let params = new HttpParams();
    params = params.set('order_direction', orderDirection);
    params = params.set('page', page.toString());
    params = params.set('page_size', pageSize.toString());
    if (orderBy) { params = params.set('order_by', orderBy); }

    return this.http.get<StudentsData>('/api/students', {params});
  }

Как видите, код почти такой же, за исключением url и type возвращаемого значения. Можно ли поместить дублированную деталь в отдельную «вещь»?

1 Ответ

1 голос
/ 17 марта 2020

Я бы создал интерфейс для аргументов и создал бы приватную функцию generi c для выполнения запроса.

export interface QueryOptions {
  orderBy?: string;
  orderDirection: string;
  page: number;
  pageSize: number;
}
getLecturesData(options: QueryOptions): Observable<LecturesData> {
  return this.getData<StudentsData>('/api/lectures', options);
}

getStudentsData(options: QueryOptions): Observable<StudentsData> {
    return this.getData<StudentsData>('/api/students', options);
}

private getData<T>(options: QueryOptions): Observable<T> {
  const params: HttpParams = this.getOptionsParams(options);
  return this.http.get<T>(url, {params});
}

private getOptionsParams(options: QueryOptions): HttpParams {
  let params = new HttpParams();
  params = params.set('order_direction', options.orderDirection || 'asc');
  params = params.set('page', (page || 1).toString());
  params = params.set('page_size', (pageSize || 10).toString());
  if (orderBy) { params = params.set('order_by', orderBy); }
  return params;
}
...