【问题标题】:Kotlin Coroutines with Node Modules带有节点模块的 Kotlin 协程
【发布时间】:2018-12-09 05:09:55
【问题描述】:

我在问自己如何将 Kotlin 的协程与一些节点模块一起使用。 我正在尝试在 Kotlin 中编写一个 node.js 服务器。

继续使用 JavaScript 著名的回调或者 Promises 会很简单, 但看起来 Kotlin 回调将是更好的选择。 但是对于 node.js 服务器,我需要使用 MySQL 或 bcrypt 库,它们只能用于回调或 Promises,但不能用于协程,因为它不是分别用 Kotlin 编写的。

Kotlin 文档对我没有帮助,JetBrains 说我只需要像同步运行一样编写我的方法,并像同步运行一样使用其他 Kotlin 函数,但是用原生 JavaScript 编写的函数不知道关键字 like “暂停”,还是我应该忽略这个事实?

一个例子是下面的函数:

val bcrypt = require("bcrypt") // require by node.js
fun comparePass(hash: String, pass: String, callback: (Boolean) -> Unit) {
    bcrypt.compare(pass, hash, { err: dynamic, res: dynamic ->
        callback(err == null)
    })
}

如何使用协程和这个库编写这个函数?

【问题讨论】:

    标签: javascript node.js kotlin node-modules kotlin-coroutines


    【解决方案1】:

    这是文档希望您编写的内容:

    suspend fun comparePass(hash: String, pass: String): Boolean =
        suspendCancellableCoroutine { continuation ->
            bcrypt.compare(pass, hash) { err: dynamic, res: dynamic ->
                continuation.resume(err == null)
            }
        }
    

    请注意,您自己的回调现在已替换为 Continuation,这是允许协程恢复的内部回调。另请注意,您的comparePass 函数的返回值现在只是Boolean,您可以像调用常规函数一样调用它,不传递您自己的回调。

    我没有使用 Kotlin-JS 的第一手经验,我不知道 dynamic 类型的语义,所以我不知道这是否可行。

    【讨论】:

      猜你喜欢
      • 2019-11-28
      • 2018-05-18
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多