Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 与初始值组合_Angular_Rxjs - Fatal编程技术网

Angular 与初始值组合

Angular 与初始值组合,angular,rxjs,Angular,Rxjs,我有两个流:user$从http.get()返回,以及userSelectAction$发出所选用户 我想将它们与CombineTest(…)组合成一个selectedUser$,我想让selectedUser$的第一个值是我从http.get()获得的第一个用户 users$=this.http.get('URL').pipe(shareReplay()); userSelectAction$=新主题(); selectedUser$=CombineTest( 此.userSelectActi

我有两个流:
user$
http.get()
返回,以及
userSelectAction$
发出所选用户

我想将它们与
CombineTest(…)
组合成一个
selectedUser$
,我想让
selectedUser$
的第一个值是我从
http.get()获得的第一个用户

users$=this.http.get('URL').pipe(shareReplay());
userSelectAction$=新主题();
selectedUser$=CombineTest(
此.userSelectAction$,
这是我们的用户$
)
.烟斗(
地图(([selecteUser,users])=>{
返回users.find(user=>user.id==selectedUser.id);
}),
shareReplay()
);

这是我迄今为止的做法。不,我必须努力使用从
用户$
收到的第一个用户初始化
selectedUser$
(它并不总是同一个用户)。

一旦收到用户列表,您可以将结果映射到映射到选定用户的
用户选择操作$
。而该流从数组中的第一个用户开始。例如:

users$=this.http.get('URL').pipe(shareReplay());
userSelectAction$=新主题();
selectedUser$=users$.pipe(
flatMap(用户=>{
返回此.userSelectAction$.pipe(
//将用户选择操作映射到用户[]
map(selecteUser=>users.find(user=>user.id==selectedUser.id)),
//从第一个用户开始
startWith(用户[0])
)
})

希望它有帮助

您可以使用
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;
}
userSelectAction$=newbehaviorsubject(空);
selectedUser$=CombineTest(
此.userSelectAction$,
这是我们的用户$
)
.烟斗(
地图(([selecteUser,users])=>selecteUser
?users.find(user=>user.id===selectedUser.id)
:getFirstUser(用户);
),
shareReplay()
);
getFirstUser(用户:用户[]):用户{
返回users&&users.length>0?用户[0]:null;
}

因此,您并不真的希望合并这两个观察值。您希望等到
用户$
发射,然后仅从
此发射继续。userSelectAction$
?这也是一种很好的方法。谢谢