如何分支 Mono,以便在 hasElement 时主进程处于 null 和类似错误的进程?

How to branch Mono so main process is on null and error-like process when hasElement?

我正在尝试理解响应式范例,但逻辑似乎与我的需求背道而驰。

情况是注册过程的早期阶段:从注册数据开始,检查提供的电子邮件是否存在帐户(取回 AccountDtonull)并处理来自那里。使用命令式方法,这很容易;在 account == null 上分支。但是对于反应式范式,我无法理解它。

如果我正在处理 account 并用某些东西代替 null 的情况,那会很好。但在这种情况下,它实际上是颠倒的:当我回来时 null – 即不存在帐户 – 我想进行主要处理以创建帐户,而当它不存在时 null,我想使用错误等效回退。

我发现唯一可行的方法是首先使用命令式分支来包装反应性元素,每个:

public ResponseDto registerAccount (RegistrationDto data)
  ResponseDto responseDto = new ResponseDto ();
  if (accountExists(data.getEmail()) {
    // return responseDto with account-exists error messaging
  } else {
    // create the account, send verification email, etc
    // return responseDto with information that verification is sent
  }
}

public boolean accountExists (String email) {
  return retrieveAccount(email)
      .hasElement().block(); 
}

public Mono<AccountDto> retrieveAccount (String email) {
  // calls db service; returns either the Mono-wrapped AccountDto or Mono-wrapped null.
}

考虑到我被推下了反应路径,我宁愿避免这种混合方法。

如果处理主体取决于 Mono 是否为空,而当它有内容要处理时相当于错误状态,我该如何处理结果?

你只差 flatMap 反应路径:

public Mono<ResponseDto> registerAccount(RegistrationDto data) {
    return retrieveAccount(data.getEmail())
        .hasElement()
        .flatMap(accountExists -> {
            if (accountExists) {
                // return responseDto with account-exists error messaging
            } else {
                return createAccount(data);
            }
        });
}

public Mono<AccountDto> retrieveAccount(String email) {
    // calls db service; returns either the Mono-wrapped AccountDto or Mono-wrapped null.
}

private Mono<ResponseDto> createAccount(RegistrationDto data) {
    // create the account, send verification email, etc
    // return responseDto with information that verification is sent
}