use*_*194 8 javascript observable rxjs rxjs5 angular
我陷入了嵌套的可观察地狱,可以用手做.
我有以下代码块
return this.findUser(term).map( users => {
return users.map( user => this.getLastLogin(user.user_id).map( last_login => {
user.last_login = last_login;
return user;
}));
});
Run Code Online (Sandbox Code Playgroud)
findUser返回Observable<User[]>并getLastLogin返回Observable<number>.
我基本上希望获取一个用户列表,然后用另一个值的信息更新它.
现在,上面的代码正在返回<Observable<Observable<User>[]>.
我以为我可以替换初始map,flatMap但是这会把对象变成<Observable<Observable<User>>.
RxJS文档有点难以破译,所以我不确定是什么组合switch,forkJoin或者flatMap会让我得到我需要的东西.
我希望能回来Observable<User[]>.有人能指出我正确的方向吗?
实际上,你不需要forkJoin()也switch()不需要这样做.
通常,您希望通过另一个异步调用更新用户数组中的每个用户.
我这样做:
var source = findUser('term')
.mergeAll()
.mergeMap(user => getLastLogin(user.user_id)
.map(last_login => {
user.last_login = last_login;
return user;
})
)
.toArray();
source.subscribe(val => console.log(val));
Run Code Online (Sandbox Code Playgroud)
运算符mergeAll()将高阶Observable转换为单个observable.在这种情况下,它接受所有用户的数组并逐个重新发出它们.然后mergeMap()发出更新last_login日期的用户.最后,我习惯toArray()将单个用户转换为一个整体发出的大型数组(如果要发出单个用户,可以删除此运算符).
请注意,当您使用时,您return users.map(...)使用Array.map()它返回一个数组,而不是map()返回一个Observable的RxJS.我认为使用单个对象通常更容易使用对象数组.
查看现场演示:https://jsbin.com/naqudun/edit?js,console
这打印到控制台:
[ { name: 'foo',
user_id: 42,
last_login: 2016-11-06T10:28:29.314Z },
{ name: 'bar',
user_id: 21,
last_login: 2016-11-06T10:28:29.316Z } ]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |