Работа с Suspend и Non-Suspend в параметрах функции Kotlin - PullRequest
1 голос
/ 27 сентября 2019

Я довольно новичок в Kotlin, и я начинаю понимать, как он реализует сопрограммы.Я понимаю, что любая функция, с которой мы, возможно, хотим, чтобы Kotlin работал неблокирующим образом, должна быть помечена suspend, и что такие функции могут быть выполнены только внутри подпрограммы (или в другой функции приостановки).Пока все хорошо.

Однако я продолжаю сталкиваться с проблемой с функциями утилит, которые принимают другие функции в качестве параметров.Например, с помощью стрелки Try:

suspend fun somethingAsync() = 1 + 1

Try { 1 + 1 } // All is well
Try { somethingAsync() } // Uh oh....

Поскольку параметр функции / оператора вызова Try не аннотирован с помощью suspend, второй вызов будет отклонен компилятором.Как с этим справляются, когда пишут служебные функции, которые не могут знать, требует ли код внутри переданной функции или лямбды приостановки или нет?Написание приостановленной и неподдерживаемой версий каждой такой функции кажется невероятно утомительным.Я пропустил очевидный способ справиться с этой ситуацией?

1 Ответ

1 голос
/ 27 сентября 2019

Во-первых, давайте разберемся с suspend.Что это означает, это конкретные функциональные блоки.Не то чтобы эта функция была асинхронной.
Обычно блокировка означает IO, но не всегда.В вашем примере функция не блокирует и не выполняет асинхронную функцию (следовательно, суффикс Async там неверен).Но давайте предположим, что реальный служебный код по какой-то причине блокируется.

Теперь работа с приостановленными функциями выполняется на стороне вызывающего.То есть, что бы вы хотели сделать во время выполнения:

fun doSomething() {
    Try { somethingAsync() }
}

Если у вас все нормально с doSomething для блокировки, вы можете использовать runBlocking:

fun doSomething() = runBlocking {
    Try { somethingAsync() }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...