Эти функции приостановки, которые вы описываете, звучат так, как будто они выполняют последовательные действия. Им не нужно запускать новые сопрограммы. Ничто не должно быть «вложенным». Это должно выглядеть примерно так (придуманный пример двух разных обратных вызовов, которые возвращают строку):
suspend fun SomeClass.doSomething(msg: String): String =
suspendCoroutine { cont ->
doSomething(msg, object: SomeCallback1 {
override fun onFinished(result: String) {
cont.resume(msg)
}
})
}
suspend fun SomeClass.doSomethingElse(msg: String): String =
suspendCoroutine { cont ->
doSomethingElse(msg, object: SomeCallback2 {
override fun onFinished(result: String) {
cont.resume(msg)
}
})
}
suspend fun SomeClass.doBothThingsInSuccession(msg: String): String {
val firstResult = doSomething(msg)
return doSomethingElse(firstResult)
}
Если вы пытаетесь скрыть детали, первые две функции приостановки могут быть закрытыми. Или вы можете объединить все в одну функцию:
suspend fun SomeClass.doBothThingsInSuccession(msg: String): String {
val firstResult: String = suspendCoroutine { cont ->
doSomething(msg, object: SomeCallback1 {
override fun onFinished(result: String) {
cont.resume(result)
}
})
}
return suspendCoroutine { cont ->
doSomethingElse(firstResult, object: SomeCallback2 {
override fun onFinished(result: String) {
cont.resume(result)
}
})
}
}