带有节点模块的 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
类型的语义,所以我不知道这是否行得通。
我在问自己如何将 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
类型的语义,所以我不知道这是否行得通。