Angular 如何通过forkjoin组合多个可观察值以产生单个可观察值

Angular 如何通过forkjoin组合多个可观察值以产生单个可观察值,angular,rxjs,fork-join,Angular,Rxjs,Fork Join,通过一个forkJoin组合两个Observable值,尝试为我的守卫获取一个Observable 我以前尝试过这种方法: isAllowedToEditSession(sessionId: number): Observable<boolean> { const isAllowed$: BehaviorSubject<boolean> = new BehaviorSubject(false); const hostName = t

通过一个
forkJoin
组合两个
Observable
值,尝试为我的守卫获取一个
Observable

我以前尝试过这种方法:

    isAllowedToEditSession(sessionId: number): Observable<boolean> {
        const isAllowed$: BehaviorSubject<boolean> = new BehaviorSubject(false);
        const hostName = this.authService.getMyDisplayName();
        this.sessionProxyService.getSessionById(sessionId).subscribe(session => {
          if (session.hostName === hostName) {
            isAllowed$.next(true);
          }
        });
        this.userService.isUserAdmin().subscribe(isAdmin => 
   isAllowed$.next(isAdmin));
        return isAllowed$.asObservable();
      }
isAllowed$
被识别为
可观察的
,但它不能正确地发出这些值

更新

这项工作(有关解释,请参见公认答案):

isAllowedToEditSession(sessionId:number):可观察{
const hostName=this.authService.getMyDisplayName();
常量被允许$=forkJoin(
此处不需要this.sessionProxyService.getSessionById(sessionId),//管道(take(1))
this.userService.isUserAdmin()管道(取(1))
).烟斗(
映射([会话,isAdmin])=>{
const isHost=session.hostName==hostName;
返回isHost | | isAdmin;
})
);
允许返回美元;
}

forkJoin
要求所有源观测值发出至少一个值,然后完成。这就是你的问题所在。您在下面使用的是
BehaviorSubject
,在调用
.complete()
之前,它不会完成

例如,您应该执行以下操作:

if (session.hostName === hostName) {
  isAllowed$.next(true);
  isAllowed$.complete();
}

因此,这取决于如何实现
getSessionById()
isUserAdmin()
。在将它们传递到
forkJoin

之前,您还可以使用
take(1)
对它们进行管道传输?您是否收到错误?抱歉,我应该指定预期的行为。这不起作用,因为在我的用例中,即使
isHost
isAdmin
应该返回true,它也不会发出true。但公认的答案是解决我的问题。谢谢!那是我的问题。不过我有一个问题,http调用是否自动完成?因为我不必在这个.sessionProxyService.getSessionById(sessionId)上执行
.pipe(take(1))
,这是一个get调用。我用最终的解决方案更新了我的帖子。是的,如果你是说
HttpClient
,它们会自动完成。
isAllowedToEditSession(sessionId: number): Observable<boolean> {
    const hostName = this.authService.getMyDisplayName();
    const isAllowed$ = forkJoin(
      this.sessionProxyService.getSessionById(sessionId), //pipe(take(1)) not needed here
      this.userService.isUserAdmin().pipe(take(1))
    ).pipe(
      map(([session, isAdmin]) => {
        const isHost = session.hostName === hostName;
        return isHost || isAdmin;
      })
    );
    return isAllowed$;
  }
if (session.hostName === hostName) {
  isAllowed$.next(true);
  isAllowed$.complete();
}