通过多个异步调用将命令式代码结构化为Spring Reactive

问题描述

我正在学习Spring Reactive编程,并且陷入将良好的旧同步代码转换为React的困境。这是示例伪代码。

Web控制器中的现有同步代码:

saveNewPersonViaPost(rawPerson: Person) {
    result = rawPerson
    errorsMap = dbService.validate(rawPerson)
    if (errorsMap.isEmpty) {
        (error,dbPerson) = dbService.saveToDatabase(rawPerson)
        if (error != null) {
            errorsMap["save-error"] = error
        } else {
            result = dbPerson
        }
    }

    sendResponse({
        "errors" : errorsMap,"person" : result
    })
}

如果' dbService.validate '和' dbService.saveToDatabase '调用都变得异步并且它们开始返回'Mono',我将如何转换这到反应式呼叫链?

// not sure if this is correct reactive implementation
fun dbService.validate(rawPerson): Mono<Errors> {
    errors = validate rawPerson values
    if (errors.isEmpty)
        return Mono.just(errors)

    return dbService.doesPersonExistInDatabase(rawPerson) // this is now a reactive call returning Mono<Boolean>
        .map { existsInDb ->
            if (existsInDb) {
                errors["db-error"] = "exists in database"
            }
            errors
        }
}

fun saveToDatabase(person: Person): Mono<Person> {
    // can throw database Exception
}

然后控制器中的控制器执行以下操作吗?:

fun saveNewPersonViaPost(rawPerson: Person) {
    dbService.validate(rawPerson).map { errors ->
        if (errors.isEmpty) {
            saveToDatabase(rawPerson)
        } else {
           Mono.just(rawPerson)
        }
     }.onErrorResume { exception ->
        // not sure how to get hold of errors object from validate here
        // I would like to do something like :
        errors["save-error"] = exception.message
     }

此外,我将如何构造它,以便可以返回带有键“错误”和“人”的对象-就像上面的同步调用中一样。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...