Uncaught TypeError: this.resultContinuation_0 не определен при попытке запустить функцию приостановки в браузере Kotlin JS по клику

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

Чтобы дать вам небольшой контекст: я пытаюсь связать этот проект (здесь вы можете скачать мой код) на VMB (виртуальная материнская плата, здесь можно скачать последнюю, еще не опубликованную версию ) через WebSockets. Я уже сделал коммуникационную часть, а также протестировал ее на ветке JVM (я также сделал еще один небольшой Kotlin JS project только с кодом для коммуникационной части, и он отлично работает, но по какой-то причине, когда я собрал все вместе, он просто не работает). Он строится без каких-либо ошибок и даже работает нормально (до некоторой степени), пока я не попытаюсь подключиться к 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. Когда вы откроете страницу, перейдите на вкладку 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

person benny b    schedule 09.07.2020    source источник
comment
можете ли вы включить фрагмент кода, который выдает это исключение, пожалуйста   -  person dazza5000    schedule 10.07.2020
comment
Проблема в том, что я не знаю точно, какая строка вызывает эту ошибку, я также сделал небольшой проект, который включает только коммуникационную часть (только для того, чтобы я мог видеть, что происходит, а также для более быстрой сборки проекта) . Я хочу интегрировать небольшой проект в venus. Проблема в том, что когда я запускаю небольшой проект, он прекрасно соединяется с VMB, но когда я пытаюсь интегрировать его в основной проект, он выдает эту ошибку. Вот небольшой проект: github.com/benny1611/korio-websockets-test   -  person benny b    schedule 10.07.2020
comment
Вот снова проект без интеграции, он не будет строиться, так как я вызываю функцию suspend в обычной функции в Driver.kt во внешнем интерфейсе. Ссылка: ufile.io/hsiwsl2j   -  person benny b    schedule 10.07.2020


Ответы (1)


Хорошо, проблема была в том, что я вызывал некоторые функции @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>
person benny b    schedule 14.07.2020