typescript 等待RxJS数据,如何返回?

rslzwgfq  于 2023-03-13  发布在  TypeScript
关注(0)|答案(1)|浏览(198)

我有一个创建用户的函数,但在创建用户之前,我想检查该会话中是否已经存在另一个具有相同userName的用户:

public createUser(form: FormGroup, sessionCode?: string): void {
  if (sessionCode && this.checkForDuplicateUserInSession(form, sessionCode)) return;

  this.apollo.mutate<CreateUser>({
    mutation: CREATE_USER,
    variables: {
      name: form.controls['user'].get('userName')?.value,
    },
  }).subscribe(
    ...
  );
}

private checkForDuplicateUserInSession(form: FormGroup, sessionCode?: string): void {
  this.apollo.query<GetSession>({
    query: GET_SESSION,
    variables: {
      code: sessionCode
    }
  }).subscribe({
    next: ({data}) => {
      return data.getSession.players.some((player) => player.name === form.controls['user'].get('userName')?.value);
    }
  });
}

checkForDuplicateUserInSession()确实可以正确地检查另一个用户是否已经存在,但我不确定如何在createUser()函数中使用它。
我是否必须创建一个userIsDuplicate$可观察对象,然后将some()结果推送到它,然后订阅它,或者有没有其他我看不到的方法?

goqiplq2

goqiplq21#

checkForDuplicateUserInSession方法中使用lastValueFrom函数转换Observable in Promise(doc here)。然后在createUser方法中使用async/await。
示例:

public async createUser(form: FormGroup, sessionCode?: string): void {
    if (sessionCode && await this.checkForDuplicateUserInSession(form, sessionCode)) return;
    
    this.apollo.mutate<CreateUser>({
        mutation: CREATE_USER,
        variables: {
            name: form.controls['user'].get('userName')?.value,
        },
    }).subscribe(
          ...
    );
}
    
private checkForDuplicateUserInSession(form: FormGroup, sessionCode?: string): void {
    return lastValueFrom(this.apollo.query<GetSession>({
        query: GET_SESSION,
        variables: {
            code: sessionCode
        }
    }).subscribe({
        next: ({data}) => {
            return data.getSession.players.some((player) => player.name === form.controls['user'].get('userName')?.value);
        }
    }));
}

相关问题