Kotlin async/await 语法不会阻塞调用者

2024-01-11

我想知道 Kotlin 是否可以取代我们当前处理异步代码的方式。现在,我们使用CompletableFutures处理异步代码。下面是这种方法的一个例子:

public void onBalanceRequest(Client client, String name) {
  db.fetchBalance(name)
    .thenAccept(balance -> {
       client.sendMessage("Your money: " + balance);
    });
}

这里重要的一点是onBalanceRequest从主线程调用,不得被阻塞。在内部,db.fetchBalance运行异步操作并在完成时解析 future,因此给定的调用不会阻塞主线程。

在查看了有关协程的 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 的东西。

谢谢。


如果你的 JS 函数是async,对应的Kotlin函数应该是suspend:

private suspend fun onBalanceRequest(client: Client) {
    val money = db.fetchBalance(client.name)
    client.sendMessage("Your money: $money")
}

没有必要await,因为 Kotlin 是静态类型的,编译器已经知道哪些函数是suspend并且需要特殊对待(尽管 C# 也是静态类型的,使用async/await明确性模型)。

注意,只能直接调用suspend功能;如果你想“一劳永逸”,请使用launch:

private fun onBalanceRequest(client: Client) = GlobalScope.launch {
    val money = db.fetchBalance(client.name)
    client.sendMessage("Your money: $money")
}

并使用您的CompletableFuture-返回函数,使用kotlinx 协程-jdk8 https://github.com/Kotlin/kotlinx.coroutines/blob/master/integration/kotlinx-coroutines-jdk8/:

// should be suggested by IDE
import kotlinx.coroutines.future.await

suspend fun fetchBalance(player: String) = originalFetchBalance(player).await()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin async/await 语法不会阻塞调用者 的相关文章

随机推荐

  • 如何使用 openssl 验证电子邮件中的 DKIM 签名?

    我已经为我的 postfix 设置了 opendkim 现在所有外发邮件都有 DKIM Signature 标题 我想要做的是手动验证 无需 DNS 和外部实用程序 最好仅使用 openssl 消息是否获得正确的签名 所以作为输入数据我有
  • 嵌套 FOR 循环和 IF 条件的问题

    我有几行文字 然后我有一个包含测试词的列表 我喜欢查找文本的每一行并检查其中是否出现一个测试词 在此之前 这与如下命令配合使用效果很好 IF not stringToTest searchstring stringToTest 但是 现在这
  • 删除MySQL查询中的重复结果

    MySQL 查询检索 totalpoints name 55 John Doe 55 John Doe 55 John Doe 55 John Doe 55 John Doe 21 Jean London 21 Jean London 13
  • RTTI 可以在设计时询问项目代码中的类型吗?

    我想使用 RTTI 在设计时而不是运行时检查项目源文件中包含的类型 据我所知 这是不受支持的 但评论中的讨论这个问题 https stackoverflow com questions 9046778 class reference as
  • 替换 hg 分支的内容

    我有一个 hg 仓库 我曾经有一个名为 1 x 的短暂分支 它在某个时间点终止了 默认 它被关闭是因为我觉得在那个特定时刻不需要使用该分支 然而 我被迫放弃 默认 的开发方式 并在创建 1 x 之前的更早版本中创建另一个分支 我无法使用 1
  • 当我尝试使用或返回枚举值时,可以避免强制转换它吗?

    如果我有以下枚举 public enum ReturnValue Success 0 FailReason1 1 FailReason2 2 Etc 我可以在返回时避免强制转换吗 如下所示 public static int main st
  • Keycloak 中的资源、范围、权限和策略

    我想使用 Keycloak 的授权系统创建一个相当简单的基于角色的访问控制系统 Keycloak 正在取代的系统允许我们创建一个 用户 他是一个或多个 组 的成员 在这个遗留系统中 通过组成员身份 其中为组分配了权限 或直接向用户授予权限
  • HTMLagilityPack 与 Powershell、Windows 身份验证相结合

    所以我有一个叫做lansweeper的工具 它在本地服务器上运行 现在我想从中抓取一个页面 但它使用 Windows 身份验证 我使用 Powershell 作为脚本语言 我主要使用HTMLAgilityPack来抓取 但我从来没有抓取过使
  • if 中的单个等于。 JavaScript。有什么好的理由吗?

    jQuery each player function key val if el pr attr plain key el text val 0 val 我继承了一个项目 但我遇到了一些奇怪的事情 启动这个项目的人是一位经验丰富的程序员
  • 打开 facebook 页面进入 facebook 应用程序 Ios + ionic

    目标 在 facebook 应用程序中打开 facebook 页面 url 我正在使用离子version 1 6我努力了 a img src img fb png alt width auto height auto a 在控制器文件中 我
  • 使用 python 抓取 javascript:void(0) 内容

    我正在制作一个程序 其中我正在废弃一个网页 并且内容从原始页面隐藏并用于显示自身herf javascript void 0 链接和文本位于 p 进而 span tags 这是我的代码 import requests re from bs4
  • 类中的 JavaScript“onclick”上下文

    今天我想知道在一个项目中保留上下文的最佳方法onClick在类中使用时的侦听器 如果this在某个地方得到了回答 请将我链接到它 我显然太愚蠢了 找不到它 无论如何 我的问题是 是否有最佳实践 或者我的一些想法是否愚蠢甚至错误 我尝试了一些
  • 如何进行 Django REST 框架 /me/ 调用?

    假设我有一个ViewSet class ProfileViewSet viewsets ModelViewSet API endpoint that allows a user s profile to be viewed or edite
  • imap 自定义关键字

    我从哪开始呢 我似乎找不到任何明确的文档 我可能找错地方了 我希望能够编辑电子邮件的 IMAP 关键字 用于标记目的 我有一些非常菜鸟的问题 它们是如何添加的 关键字是否直接应用于消息标头 如果是 语法是什么 或者是否有其他类型的 imap
  • 错误:java.lang.SecurityException:签名者信息与同一包中其他类的签名者信息不匹配

    我正在使用下面的 jar 文件 bcmail jdk16 1 46 bcprov jdk16 1 46 commons codec 1 9 commons io 2 5 我在这一行遇到错误 CMSSignedData cms new CMS
  • python中通过爬取子URL来下载文件

    我正在尝试从大量网络链接下载文档 主要是pdf格式 如下所示 https projects worldbank org en projects operations document detail P167897 type projects
  • 当未设置属性时,构建失败的简单方法是什么?

    正如标题中所述 我如何以最简单的方式修改apom xml为了使其在命令行中未设置属性时失败 例如 mvn clean package将会失败 当mvn clean package Dfoo bar将会成功 我正在寻找类似的东西
  • 每秒基板事务性能

    大家好 我有一个与性能相关的问题 我正在运行 2 个具有 30GB 存储空间的 aws 实例 t2 2xlarge 我正在使用默认设置在每个节点上运行 v2 0 节点 几天前从 master 分支 并且我正在测试每秒可以处理多少事务 平均每
  • 为什么我需要在 JPA 中双向设置实体

    我有以下两个实体 Entity public class Pilot implements Serializable ManyToOne JoinColumn name FLIGHT ID private Flight flight and
  • Kotlin async/await 语法不会阻塞调用者

    我想知道 Kotlin 是否可以取代我们当前处理异步代码的方式 现在 我们使用CompletableFutures处理异步代码 下面是这种方法的一个例子 public void onBalanceRequest Client client