【问题标题】:Uncaught TypeError: this.resultContinuation_0 is undefined when trying to run a suspend function in Kotlin JS Browser onclickUncaught TypeError: this.resultContinuation_0 is undefined when trying to run a suspend function in Kotlin JS Browser onclick
【发布时间】:2021-07-29 20:20:48
【问题描述】:

我正在Kotlin 中开发一个多平台 RISC-V 模拟器,我已经被一个问题困住了一个多星期了。我已经尝试了所有可以在网上找到的方法,但都没有成功。

给你一点背景: 我正在尝试通过WebSocketsthis项目(here你可以下载我的代码)绑定到VMB(虚拟主板,here你可以下载最新的,尚未发布的版本)。我已经完成了通信部分并在JVM 分支上对其进行了测试(我还制作了另一个小型 Kotlin JS project,其中仅包含通信部分的代码,它工作正常,但由于某种原因,当我把所有东西放在一起它就是行不通的)。它构建时没有任何错误,甚至可以正常工作(在一定程度上),直到我尝试连接到VMB,然后我在浏览器控制台中收到错误消息Uncaught TypeError: this.resultContinuation_0 is undefined。我在这个问题上浪费了很多时间,而且我很确定这只是我遗漏的一些小东西(甚至可能很明显)。

重现问题的步骤:

  1. 下载项目(您将需要venusVMB
  2. 如果没有,请在您的计算机上下载并安装grunt
  3. vmb 文件夹中双击mother.exe 并确保单击电源按钮(它仅适用于Windows,抱歉)
  4. InteliJ 中打开venus 项目并使用gradle 构建它(IntelliJ 通常会自动将项目识别为gradle
  5. 构建完成后,在venus文件夹中打开Powershellcmd,运行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

【问题讨论】:

  • 能否请您包含引发此异常的代码的 sn-p
  • 问题是我不知道究竟是哪一行导致了这个错误,我还做了一个只包含通信部分的小项目(只是为了让我能看到发生了什么并且还可以更快地构建项目)。我想把这个小项目整合到venus。问题是,当我运行小项目时,它与VMB 连接得很好,但是当我尝试将它集成到主项目中时,它给了我这个错误。这是一个小项目:github.com/benny1611/korio-websockets-test
  • 这里又是没有集成的项目,这不会构建,因为我在前端 Driver.kt 的“正常”函数中调用 suspend 函数。链接:ufile.io/hsiwsl2j

标签: kotlin gradle simulator kotlin-coroutines kotlin-js


【解决方案1】:

好的,问题是我在 HTML 代码中调用了一些 @JSName 函数。像这样的:

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

然后在我的 HTML 代码中,我有一些这样的行:

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

这里的关键是suspend 关键字。如果从 JS/HTML 调用“普通”函数没有问题,但不能从 HTML 调用 suspend 函数。它必须在launch 块或Coroutine 中,否则Continuation 将是null。所以我把kotlin 代码改成了这样:

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

当然,在这样做之后,我必须从我的 HTML 对象中删除 onclick 部分,如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 2014-06-28
    • 1970-01-01
    • 2013-10-20
    • 2015-09-18
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多