Хорошо.У меня есть некоторый асинхронный код в моем Angular-компоненте, который работает просто отлично.Выглядит так (кратко):
export class SomeComponent {
user: User;
/* ... */
email: string;
/* ... */
private someMethod(): void {
/* some code here */
this.userService1.getUsers().subscribe(users => {
users.forEach(user => {
if (user.email && user.email === this.email) {
this.userService2.getUser(user.id).subscribe(foundUser => {
let someFields;
if (foundUser) {
someFields = (({ field1, field2 }) => ({ field1, field2 }))(foundUser);
}
this.user = {...user, ...someFields};
});
}
});
});
/*some code here */
}
}
Я пропускаю некоторые типы и называю переменные немного неловко (но просто), потому что это не главное.Код работает.Но Я хочу инкапсулировать процесс построения пользователя (из 2 сервисов), потому что он мне понадобится в разных компонентах.Я пытался, но ...
constructUser(email): Observable<IUser> {
let finalUser: IUser;
return this.userService1.getUsers().merge(users => {
return users.filter(user => {
if (user.email && user.email === email) {
return this.userService2.getUser(user.id).map(foundUser => {
let someFields;
if (foundUser) {
someFields = (({ field1, field2 }) => ({ field1, field2 }))(foundUser);
}
finalUser = {...user, ...someFields};
return Observable.of(finalUser);
});
}
});
});
}
Мой WebStorm не показывает ошибки.Но в консоли я получаю this.userService1.getUsers (...). Слияние не является функцией .
я пробовал слияние , concat , flatMap , как угодно - но все равно безуспешно.Единственная разница была в ошибках, которые я получил.У меня нет большого опыта работы с rxjs, поэтому я застрял.Буду очень признателен за любую помощь или подсказки.
UPD.
Решено, но в течение 7 дней (пока активна награда) любой по-прежнему приветствует более краткие и функциональные решения:)