带有节点模块的 Kotlin 协程

Kotlin Coroutines with Node Modules

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

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

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

一个例子是下面的函数:

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)
    })
}

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

这就是文档要您编写的内容:

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

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

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