【发布时间】:2018-11-18 23:05:15
【问题描述】:
嗯。我的 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(...).merge is not a function.
我已经尝试过 merge、concat、flatMap 等等 - 但仍然没有成功。唯一的区别是我遇到的错误。我对 rxjs 没有太多经验,所以我被卡住了。任何帮助或提示将不胜感激。
UPD。
已解决,但在 7 天(赏金活动期间)仍然欢迎任何人提供更简洁和实用的解决方案:)
【问题讨论】:
标签: javascript angular functional-programming rxjs observable