При создании API в Kotlin, каков идиоматический способ обработки асинхронных действий?
Мы могли бы создать apis, который требует обычных блокирующих вызовов, заставляя код приложения использовать что-то вроде 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)
}
Есть ли консенсус или официальная позиция в отношении того, что нам следует делать?