与最新值合并

时间:2019-05-24 08:36:46

标签: angular rxjs

我有两个流: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$

2 个答案:

答案 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)

您可以使用BehaviorSubjectuserSelectAction$分配一个初始值。这样,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;
}