关于 webclient 的 kotlin 协同程序的问题
question on kotlin coroutines with webclient
我是科特林的新手。我编写了一个函数来并行处理两个 webclient 调用,然后聚合结果。关键是它是用java风格写的(在代码下面)
@GetMapping("/personv1/{id}")
suspend fun getPerson1(@PathVariable id :Integer): Mono<Person> =
Mono.zip(
webClient.get().uri("/person/{id}", id).retrieve().bodyToMono(Person::class.java),
webClient.get().uri("/person/{id}/domain", id).retrieve().bodyToMono(String::class.java)
) { person, domain -> Person(person.id, person.name, domain) }
我想按照示例使用协程制作相同的代码,但一开始就被阻止了。我的想法是声明两个变量,一个是 Person 的 Deferred 类型,另一个是 String 的 Deferred 类型,然后等待它们合并数据,但我无法声明任何变量。
这是我开始的代码
@GetMapping("/personv2/{id}")
suspend fun getPerson2(@PathVariable id :Integer): Person = coroutineScope {
val person: Deferred<Person> = async {
webClient
.get()
.uri("/person/{id}", id)
.retrieve()
.awaitBody<Person>()
}
}
但是我的 IDE 告诉我我的 person val 应该是 ServerResponse 类型而不是 Person
的 Deferred
有人可以帮我吗?我做错了什么?
感谢您的帮助
将 async
替换为 this@coroutineScope.async
。
在您的 coroutineScope
lambda 中,必须有一些名为 async
的其他函数具有比 CoroutineScope.async
更高的优先级分辨率。 coroutineScope
lambda 被传递给一个 CoroutineScope 作为接收者,所以 this@coroutineScope.async
会澄清你具体是想在 lambda 的接收者上调用 CoroutineScope.async
而不是其他一些 async
函数.
我不熟悉 Spring,所以我无法猜测另一个 async
函数是什么。您可以更改此文件中的导入,这样 async
将解析为 CoroutineScope.async
,而无需在其前面加上 this@coroutineScope
。如果您想找出它正在解析的其他函数,请删除前缀并按住 Ctrl 并单击函数名称 async
,然后 IDE 将带您到它的源代码。
我是科特林的新手。我编写了一个函数来并行处理两个 webclient 调用,然后聚合结果。关键是它是用java风格写的(在代码下面)
@GetMapping("/personv1/{id}")
suspend fun getPerson1(@PathVariable id :Integer): Mono<Person> =
Mono.zip(
webClient.get().uri("/person/{id}", id).retrieve().bodyToMono(Person::class.java),
webClient.get().uri("/person/{id}/domain", id).retrieve().bodyToMono(String::class.java)
) { person, domain -> Person(person.id, person.name, domain) }
我想按照示例使用协程制作相同的代码,但一开始就被阻止了。我的想法是声明两个变量,一个是 Person 的 Deferred 类型,另一个是 String 的 Deferred 类型,然后等待它们合并数据,但我无法声明任何变量。
这是我开始的代码
@GetMapping("/personv2/{id}")
suspend fun getPerson2(@PathVariable id :Integer): Person = coroutineScope {
val person: Deferred<Person> = async {
webClient
.get()
.uri("/person/{id}", id)
.retrieve()
.awaitBody<Person>()
}
}
但是我的 IDE 告诉我我的 person val 应该是 ServerResponse 类型而不是 Person
的 Deferred有人可以帮我吗?我做错了什么?
感谢您的帮助
将 async
替换为 this@coroutineScope.async
。
在您的 coroutineScope
lambda 中,必须有一些名为 async
的其他函数具有比 CoroutineScope.async
更高的优先级分辨率。 coroutineScope
lambda 被传递给一个 CoroutineScope 作为接收者,所以 this@coroutineScope.async
会澄清你具体是想在 lambda 的接收者上调用 CoroutineScope.async
而不是其他一些 async
函数.
我不熟悉 Spring,所以我无法猜测另一个 async
函数是什么。您可以更改此文件中的导入,这样 async
将解析为 CoroutineScope.async
,而无需在其前面加上 this@coroutineScope
。如果您想找出它正在解析的其他函数,请删除前缀并按住 Ctrl 并单击函数名称 async
,然后 IDE 将带您到它的源代码。