我有两个流:user$
从http.get()
返回,而userSelectAction$
发出选定的用户。
我想将它们与selectedUser$
合并为combineLatest(..)
,并且我希望selectedUser$
的第一个值是我从http.get()
获得的第一个用户。
users$ = this.http.get<User[]>('URL').pipe(shareReplay());
userSelectAction$ = new Subject<User>();
selectedUser$ = combineLatest(
this.userSelectAction$,
this.users$
)
.pipe(
map(([selecteUser, users]) => {
return users.find(user=> user.id=== selectedUser.id);
}),
shareReplay()
);
这是我到目前为止的方法。不,我很难用从selectedUser$
收到的第一个用户(并非总是同一用户)来初始化users$
。
答案 0 :(得分:1)
收到用户列表后,您就可以flatMap生成映射到所选用户的userSelectAction$
。并且该流startWith
是数组中的第一个用户。例如:
users$ = this.http.get<User[]>('URL').pipe(shareReplay());
userSelectAction$ = new Subject<User>();
selectedUser$ = users$.pipe(
flatMap(users => {
return this.userSelectAction$.pipe(
// map user select action onto users[]
map(selecteUser => users.find(user=> user.id=== selectedUser.id)),
// start with first user
startWith(users[0])
)
})
希望有帮助
答案 1 :(得分:1)
您可以使用BehaviorSubject
为userSelectAction$
分配一个初始值。这样,combineLatest
将在users$
发出后立即启动。然后检查空值并分配所需的用户。
userSelectAction$ = new BehaviorSubject<User>(null);
selectedUser$ = combineLatest(
this.userSelectAction$,
this.users$
)
.pipe(
map(([selecteUser, users]) => selectedUser
? users.find(user=> user.id === selectedUser.id)
: getFirstUser(users);
),
shareReplay()
);
getFirstUser(users: User[]): User {
return users && users.length > 0 ? users[0] : null;
}