imp*_*end 6 javascript functional-programming observable rxjs angular
好.我的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 */
}
}
Run Code Online (Sandbox Code Playgroud)
我跳过一些类型和名称变量有点尴尬(但很简单)因为它不是重点.代码有效.但我想封装用户构建过程(来自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);
});
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
我的WebStorm没有显示任何错误.但是在控制台中我得到了这个.userService1.getUsers(...).merge不是一个函数.
我尝试过merge,concat,flatMap,无论如何 - 但仍然没有成功.唯一的区别是我得到的错误.我对rxjs没有多少经验,所以我被卡住了.任何帮助或提示将不胜感激.
UPD.
解决了,但7天(虽然赏金活跃)任何人仍然欢迎更简洁和功能的解决方案:)
我觉得这样的事情就是你想要的:
RxJs 5:
import 'switchMap' from 'rxjs/add/operator/switchMap';
import 'map' from 'rxjs/add/operator/map';
this.userService1.getUsers()
.map(users => users.find(userInList => userInList.email === "SomeEmail")) //Map the observable with users to a single user
.switchMap(user => this.userService2.getUser(user.id)) //Map the observable by an other observable
.subscribe(...doSomething with the result)
Run Code Online (Sandbox Code Playgroud)
RxJs 6:
import {map, switchMap} from 'rxjs/operators';
this.userService1.getUsers().pipe(
map(users => users.find(userInList => userInList.email === "SomeEmail")), //Map the observable with users to a single user
switchMap(user => this.userService2.getUser(user.id)) //Map the observable by an other observable
).subscribe(...doSomething with the result)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
275 次 |
最近记录: |