gpt4 book ai didi

javascript - 展平嵌套的 Observable

转载 作者:数据小太阳 更新时间:2023-10-29 04:11:16 27 4
gpt4 key购买 nike

我被困在嵌套的可观察 hell 中,需要一只手。

我有以下代码块

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;
}));
});

findUser返回 Observable<User[]>getLastLogin返回 Observable<number> .

我基本上希望获取用户列表,然后使用来自另一个值的信息更新它。

现在上面的代码正在返回 <Observable<Observable<User>[]> .

我想我可以替换初始的 mapflatMap但这会将对象变成 <Observable<Observable<User>> .

RxJS 文档有点难以解读,所以我不确定 switch 的组合是什么, forkJoinflatMap会让我得到我需要的东西。

我希望返回 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));

接线员 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 } ]

关于javascript - 展平嵌套的 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40445418/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com