问题描述
我正在学习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 (将#修改为@)