Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Kotlin中的协同程序作用域获取返回值?_Kotlin_Vert.x_Kotlin Coroutines_Caffeine - Fatal编程技术网

如何从Kotlin中的协同程序作用域获取返回值?

如何从Kotlin中的协同程序作用域获取返回值?,kotlin,vert.x,kotlin-coroutines,caffeine,Kotlin,Vert.x,Kotlin Coroutines,Caffeine,我正在用咖啡因和Kotlin建立一个缓存。我有这样的想法: private val esCache: Cache<EsRequestParam, EsResponse> = Caffeine.newBuilder() .expireAfterWrite(30, TimeUnit.SECONDS) .refreshAfterWrite(50, TimeUnit.SECONDS) .build<EsRequestParam, EsResponse> {

我正在用咖啡因和Kotlin建立一个缓存。我有这样的想法:

private val esCache: Cache<EsRequestParam, EsResponse> = Caffeine.newBuilder()
    .expireAfterWrite(30, TimeUnit.SECONDS)
    .refreshAfterWrite(50, TimeUnit.SECONDS)
    .build<EsRequestParam, EsResponse> {
        runBlocking {
            sendRequest(it)
        }
    }


private suspend fun sendRequest(requestParams: EsRequestParam): EsResponse? {
        val result = client
                .sendJsonObjectAwait(
                        JsonObject(
                            buildPostBody(requestParams)
                        ))
                .bodyAsJson(EsResponse::class.java)
        esCache.put(requestParams, result)
        return result
    }
private-val-esCache:Cache=caffee.newBuilder()
.expireAfterWrite(30,时间单位。秒)
.refreshAfterWrite(50,时间单位:秒)
.建造{
运行阻塞{
发送请求(it)
}
}
私有挂起fun sendRequest(requestParams:EsRequestParam):EsResponse?{
val结果=客户端
.SendJSONObject等待(
JsonObject(
buildPostBody(requestParams)
))
.bodyAsJson(EsResponse::class.java)
esCache.put(请求参数,结果)
返回结果
}
因为我也在使用Vertx,所以我知道它有一个事件循环,可以阻止并阻止我的应用程序。运行阻塞给我带来了这个问题。因此,我需要将这个
运行阻塞
交换给其他一些Vertx资源,或者可能是
GlobalScope.launch(Vertx.dispacher())
。这样我就可以避免阻塞事件。 问题是:我不知道我可以使用哪个Vertx资源,也不能使用
GlobalScope.launch
,因为它返回一个作业,而不是
sendRequest
函数返回的值。 有什么想法吗?
注:由于
sendRequest
是一个暂停的乐趣,我只能从协同程序或其他暂停的乐趣中调用它:(

也许尝试使用AsyncLoadingCache可以在未来和协同程序之间转换?我不知道咖啡因是什么,但在
main
函数的顶层之外的任何地方使用
runBlocking
几乎都是错误的。有一个先验知识可能会对您有所帮助。