Uncaught TypeError: this.resultContinuation_0 не определено при попытке запустить функцию приостановки в Kolin JS Браузер onclick - PullRequest
2 голосов
/ 09 июля 2020

Я работаю над мультиплатформенным симулятором RIS C -V в Kotlin, и вот уже больше недели я застрял на проблеме. Я перепробовал все, что мог найти в Интернете, но мне не повезло.

Чтобы дать вам небольшой контекст: я пытаюсь связать этот проект ( здесь вы можете загрузить мой код) на VMB (виртуальная материнская плата, здесь вы можете загрузить последнюю, еще не опубликованную версию) через WebSockets. Я уже сделал коммуникационную часть, а также протестировал ее в ветке JVM (я также сделал еще один небольшой Kotlin JS проект только с кодом для коммуникационной части, и он работает хорошо, но почему-то когда я все собираю, просто не получается). Он строится без каких-либо ошибок, и он даже работает нормально (в некоторой степени), пока я не попытаюсь подключиться к VMB, а затем я получаю сообщение об ошибке в консоли браузера с надписью Uncaught TypeError: this.resultContinuation_0 is undefined. Я потерял так много часов на эту проблему, и я почти уверен, что мне не хватает чего-то маленького (возможно, даже очевидного).

Шаги для воспроизведения проблемы:

  1. Загрузите проекты (вам потребуются и venus, и VMB)
  2. Загрузите и установите grunt на свой компьютер, если его у вас нет
  3. В папке vmb дважды щелкните mother.exe и обязательно нажмите кнопку питания (работает только на windows, извините)
  4. Откройте проект venus в InteliJ и соберите его, используя gradle (IntelliJ обычно автоматически распознает проект как gradle)
  5. После завершения сборки откройте Powershell или cmd в папке venus и запустите grut dist
  6. Теперь результаты должны быть в каталоге out.
  7. Возможно, вам понадобится XAMPP для локального размещения файлов на сервере на случай, если вы получите CORS Error
  8. Когда вы открываете страницу go на вкладке Simulator, а затем нажимаете кнопку Assemble & Simulate from Editor.
  9. Вы должны Теперь я могу увидеть ошибку в консоли.

Любая помощь приветствуется, так как я застрял в этой проблеме уже несколько дней. Спасибо!

РЕДАКТИРОВАТЬ:

При дальнейшем копании я заметил, что проблема возникает всякий раз, когда я вызываю suspend функцию onclick.

Например: я сделал функция в Driver.kt:

    @JsName("connect")
    suspend fun connect() {
        sim.connectToMotherboard()
    }

Где connectToMotherboard() - это приостановленная функция, которую я вызываю всякий раз, когда нажимается кнопка.

HTML:

<button class="button is-primary" onclick="driver.connect()">Connect to Motherboard</button>

Это дает мне ту же ошибку, что упоминается в заголовке. После того, как я скачал Firefox для разработчиков, я получил это сообщение:

Uncaught TypeError: can't access property "context", this.resultContinuation_0 is undefined

1 Ответ

1 голос
/ 14 июля 2020

Хорошо, проблема заключалась в том, что я вызвал некоторые @JSName функции в моем HTML коде. Примерно так:

@JsName("doSomething")
suspend fun doSomething() {
    // some code...
}

А затем в моем HTML коде у меня было несколько строк вроде этого:

<button id="someButton" class="button" onclick="doSomething()">Click Me</button>

Ключ здесь - ключевое слово suspend. Если вы вызываете «обычную» функцию из JS / HTML, проблем нет, но функция suspend не может быть вызвана из HTML. Он должен быть в блоке launch или Coroutine, иначе Continuation будет null. Поэтому я изменил код kotlin на что-то вроде этого:

val myButton = document.getElementById("someButton")
simulatorRunButton!!.addEventListener("click", {
    launch(EmptyCoroutineContext) {
        doSomething()
    }
})

Конечно, после этого мне пришлось стереть часть onclick из моего объекта HTML, примерно так:

<button id="someButton" class="button">Click Me</button>
...