Я написал простой PersonService
, который выглядит следующим образом:
@Injectable()
export class PersonsService {
constructor(
private httpService: HttpService,
private cacheService: CacheService,
) {}
public async getPersonWithCache(id: number): Promise<Person> {
if (await this.cacheService.hasKey(id)) {
console.log('Hitting the cache...');
return this.cacheService.getPerson(id);
} else {
const person = await this.httpService.get(`http://localhost:3000/persons/${id}`)
.pipe(map((rawPerson: AxiosResponse<IPersonRawResponse>) => new Person().deserialize(rawPerson.data)))
.toPromise();
this.cacheService.setPerson(id, person);
return person;
}
}
public async getPerson(id: number): Promise<Person> {
return this.httpService.get(`http://localhost:3000/persons/${id}`)
.pipe(map((rawPerson: AxiosResponse<IPersonRawResponse>) => new Person().deserialize(rawPerson.data)))
.toPromise();
}
Я хотел бы использовать пользовательский декоратор Cacheable
для функции getPerson
.
Я начал писать это. не то, как это выглядит:
export function Cacheable() {
// tslint:disable-next-line: only-arrow-functions
return function(target: Object, key: string | symbol, descriptor: PropertyDescriptor) {
const original = descriptor.value;
// tslint:disable-next-line: only-arrow-functions
descriptor.value = function(... args: any[]) {
return original.apply(this, args);
};
};
}
Так что это мало что дает. Я просто пытался выяснить, как получить доступ к cacheService
внутри этой функции, я никогда раньше не работал с декораторами в машинописи, и это не ясно из документации.
Я был бы очень признателен, если бы кто-то объясните мне, как это сделать.