具有节点模块的Kotlin协程

时间:2018-12-09 05:09:56

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

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

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

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

示例如下:

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

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

1 个答案:

答案 0 :(得分:2)

这是文档要你写的:

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,您可以像常规函数一样调用它,而不会传递您自己的回调。

我没有Kotlin-JS的第一手经验,我不知道那种 FluxExchangeResult<Post> res = webTestClient.post().uri(BASE_URI) .contentType(MediaType.APPLICATION_JSON_UTF8) .accept(MediaType.APPLICATION_JSON_UTF8) .body(Mono.just(post), Post.class) .exchange() .returnResult(Post.class); Post retPost = res.getResponseBody().blockFirst(); 类型的语义,所以我不知道这是否行得通。