关于 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 将带您到它的源代码。