gpt4 book ai didi

kotlin - 在Kotlin中使用异步操作创建API的惯用方式是什么?

转载 作者:行者123 更新时间:2023-12-02 12:58:36 25 4
gpt4 key购买 nike

在Kotlin中创建API时,处理异步操作的惯用方式是什么?

我们可以创建需要常规阻塞调用的api,从而迫使应用程序代码使用runBlocking之类的东西。

////
//// Plain functions
////

// library code
fun registerHandler(block: (it: Foo) -> String) {
// save a reference to call when an action happens later
}

// application code
registerHandler {
runBlocking {
handleItSuspend(it)
}
}

我们可以更多地使用 suspend,它对于应用程序代码来说看起来更好,但是要求我们从暂停函数或协程上下文执行回调,这可能给我们带来麻烦,也可能不会给我们带来麻烦。
////
//// Suspend functions
////

// library code
fun registerHandler(block: suspend (it: Foo) -> String) {
// save a reference to call when an action happens later
}

// application code
registerHandler {
handleItSuspend(it)
}

或者我们可以采用返回延迟结果的函数
////
//// Deferred functions
////

// library code
// This handler can be called from anywhere without needing suspend.
fun registerHandler(block: (it: Foo) -> Deferred<String>) {
// save a reference to call when an action happens later
}

// application code
registerHandler {
// Function that isn't suspend but returns a deferred
handleItAsync(it)
}

对于我们应该做的事情是否有共识或官方立场?

最佳答案

正如@ msrd0在注释中提到的那样,您可以轻松地在第二种方法和第三种方法的参数之间进行转换,因此它们是等效的:

val block1: suspend (Foo) -> String = ...
val block2: (Foo) -> Deferred<String> = { x -> async { block1(x) } }
val block3: suspend (Foo) -> String = { x -> block2(x).await() }

但我希望大多数 Deferred版本的调用看起来像
registerHandler { foo -> async { doSomethingSuspend(foo) } }

在这种情况下, suspend版本更易于使用,它将只是
registerHandler { foo -> doSomethingSuspend(foo) }

当然,您的代码库可能已经普遍使用 Deferred,以至于这种假设不成立。

requires that we execute our callbacks from suspend functions or coroutine contexts, which may or may not be inconvenient for us.



我认为这不太方便,因为它只是 async内部的一个简单 registerHandler(或另一个协程生成器)调用。

还是您是说需要在其中调用 registerHandler?只有将其本身声明为 suspend,这才是正确的。

关于kotlin - 在Kotlin中使用异步操作创建API的惯用方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com