【发布时间】:2018-11-02 11:44:52
【问题描述】:
我想知道 Kotlin 是否可以取代我们当前处理异步代码的方式。现在,我们使用CompletableFutures 来处理异步代码。以下是此类方法的示例:
public void onBalanceRequest(Client client, String name) {
db.fetchBalance(name)
.thenAccept(balance -> {
client.sendMessage("Your money: " + balance);
});
}
这里的重点是onBalanceRequest 是从主线程调用的,不能被阻塞。在内部,db.fetchBalance 运行异步操作并在完成时解析未来,因此给定的调用不会阻塞主线程。
在查看了有关协程的 Kotlin 文档后,我希望我们可以做一些类似于 JavaScript 的 async/await 的事情。例如,这是我们在 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 的执行阻塞了主线程。所以我问你,如果我能用 Kotlin 实现类似于 async/await 的东西。
谢谢。
【问题讨论】:
-
如果你一开始不想屏蔽,为什么还要使用
runBlocking? -
因为我不知道我可以尝试什么。就是那个问题。这只是一个形象化“想法”的例子。
-
runBlocking用于阻塞代码...launch用于非阻塞 ;-) -
将
runBlocking替换为launch时,我的代码将无法编译。我不太明白为什么,但我认为它不能在那里使用? -
“不会编译”是什么意思?你在使用 Kotlin 1.3 吗?