Вам необходимо указать область действия:
fun doWorkAsync(msg: String) = GlobalScope.async {
log("$msg - Working")
delay(500)
log("$msg - Work Done")
return@async 42
}
Таким образом, внутри вашей лямбды у вас будет CoroutineScope
.
Примечание. Поскольку вы используете тело выражения,вам не нужно явно указывать тип возврата Deferred<Int>
.Это можно сделать вывод.
Более гибкое решение с использованием приостановленной функции
Но есть еще лучший способ.Я имею в виду, что в этом контексте очевидно, что функция должна быть асинхронной.Но что, если вам нужна функция, которую можно вызывать асинхронно и последовательно?
Вот где вступают в действие функции приостановки.Вы определяете свою функцию следующим образом:
suspend fun doWork(): Int {
// ...
delay(500)
// ...
return 42
}
Затем вы можете решить на call-site, как вы хотите ее использовать:
val d: Deferred<Int> = GlobalScope.async { doWork() } // asnyc
val i: Int = runBlocking { doWork() } // sequential