Я создал сервис, который получает некоторые пользовательские данные из удаленного источника. Сервис - это метод для получения нескольких пользователей и один для получения определенного пользователя. Наблюдаемые, возвращаемые двумя метонами, получают .pipe (ed) через map (), чтобы иметь возможность изменять пользовательские объекты до того, как они будут использованы.
Я хочу определить мутаторы только один раз, как для потока с несколькими пользователями, так и для потока с одним пользователем, но при моем текущем подходе я сталкиваюсь с проблемами области действия.
Имейте в виду, что я называю пользователей героями. Это аспект дизайна. Ниже приведены соответствующие методы из моего класса HeroService:
export class HeroService {
// [...]
getHeroes(): Observable<Hero[]> {
return this.http.get<Hero[]>(this.heroesUrl).pipe(
map((heroes: Hero[]) => this.mutateHeroes(heroes, this.addSkillsToHero)),
map((heroes: Hero[]) => this.mutateHeroes(heroes, this.splitName))
);
}
getHero(id): Observable<Hero> {
return this.http.get<Hero>(this.heroesUrl + "/" + id).pipe(
map((hero: Hero) => this.addSkillsToHero(hero)),
map((hero: Hero) => this.splitName(hero))
);
}
private mutateHeroes(heroes: Hero[], mutator) {
heroes.forEach((hero: Hero) => {
hero = mutator(hero);
});
return heroes;
}
private splitName(hero: Hero) {
let heroNames: string[] = hero.name.split(" ");
hero.firstname = heroNames.splice(0, 1).join(" ");
hero.lastname = heroNames.splice(heroNames.length - 1, 1).join(" ");
hero.middlename = heroNames.join(" ");
return hero;
}
private addSkillsToHero(hero: Hero) {
hero.skills = this.getSkills(Math.ceil(Math.random() * 10));
return hero;
}
private getSkills(count: number): string[] {
let skills: string[] = [];
let i;
for (i = 0; i < count; i++) {
skills.push(this.getRandomSkill());
}
return skills;
}
private getRandomSkill(): string {
return SKILL_TAGS[Math.floor(Math.random() * SKILL_TAGS.length)];
}
// [...]
}
CatchError () Observable (s) возвращает: Cannot read property 'getSkills' of undefined
Я подозреваю, что мутатор не вызывается внутри области класса и поэтому не может быть найден.
Как бы я сделал это в JS?
Весь проект можно осмотреть по адресу: