首页 文章

带节点模块的Kotlin协同程序

提问于
浏览
4

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

继续使用JavaScripts着名的回调或Promises是很简单的,但看起来Kotlin回调将是更好的选择 . 但是对于node.js服务器,我需要使用MySQL或bcrypt库,只使用回调或Promise但不能使用协同程序,因为它不是分别用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)
    })
}

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

1 回答

  • 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 ,您将其称为常规函数,不传递您自己的回调 .

    我不知道 dynamic 类型的语义,所以我不知道这是否有效 .

相关问题