Я хотел бы выяснить, сможет ли Kotlin заменить наш текущий способ работы с асинхронным кодом. Прямо сейчас мы используем CompletableFutures
для обработки асинхронного кода. Вот пример такого метода:
public void onBalanceRequest(Client client, String name) {
db.fetchBalance(name)
.thenAccept(balance -> {
client.sendMessage("Your money: " + balance);
});
}
Важным моментом здесь является то, что onBalanceRequest
вызывается из основного потока, который не должен быть заблокирован. Внутренне db.fetchBalance
выполняет асинхронные операции и разрешает будущее по завершении, поэтому данный вызов не блокирует основной поток.
После просмотра документации Kotlin по сопрограммам я надеялся, что мы сможем сделать что-то вроде асинхронного / ожидающего выполнения JavaScript. Например, вот что мы можем сделать в JavaScript:
async function onBalanceRequest(client, name) {
let balance = await db.fetchBalance(name);
client.sendMessage("Your money: " + balance);
}
Теперь я попытался подключить наш существующий API к проекту Kotlin:
private fun onBalanceRequest(client: Client) = runBlocking {
val money = db.fetchBalance(client.name)
client.sendMessage("Your money: $money")
}
suspend fun fetchBalance(player: String): Double? {
var result: Double? = null
GlobalScope.launch {
originalFetchBalance(player).thenAccept {
result = it
}
}.join()
return result
}
Однако, поскольку я использовал runBlocking
, выполнение onBalanceRequest
блокирует основной поток. Так что я спрашиваю вас, смогу ли я добиться чего-то похожего на async / await с Kotlin.
Спасибо.