Котлин сопрограммы с узловыми модулями - PullRequest
0 голосов
/ 09 декабря 2018

Я спрашиваю себя, как я могу использовать сопрограммы Котлина вместе с некоторыми модулями узлов.Я пытаюсь написать сервер node.js в Kotlin.

Было бы просто продолжать использовать известные обратные вызовы JavaScripts или, возможно, 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)
    })
}

Как я могу написать эту функцию, используя сопрограммы и эту библиотеку?

1 Ответ

0 голосов
/ 09 декабря 2018

Это то, что документация хотела, чтобы вы написали:

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, поэтому я не знаю, сработает ли это.

...