Kotlin/JS HTMLButtonElement EventListener 中的暂停函数
Kotlin/JS suspension function in an HTMLButtonElement EventListener
我正在为浏览器编写一个针对 KotlinJS 的程序。我不太了解 Kotlinx 的协程,但我需要它们来避免线程冻结 20 分钟。
suspend fun getBigList(ids: bundleID) {
val resp = GlobalScope.async{requestS("URLwithPARAMS${ids}")}
val bigList = resp.await()?.let { it1 -> Json{ignoreUnknownKeys = true}.decodeFromString<LogList>(it1) }
//do something with bigList, or return it and do something in the event listener, either way it will have to be a suspended function that makes HTTP requests based on the bigList
}
//requestS is a synchronous xmlHTTP request. wrapping synchronous with async instead of creating an async xmlHTTP request so that I can await on the response instead of using callbacks.
suspend fun main() {
val button = document.getElementById("mybutton") as HTMLButtonElement
val input = document.getElementById("myinput") as HTMLInputElement
button.addEventListener("click", {
val playerIDs = {/* data class instance derived from input.value */}
getBigList(playerIDs)
})
}
在button.addEventListener中调用getBigList导致错误,Suspension functions can be called only within coroutine body
我明白它为什么这样做(addEventListener 不可暂停),但我不知道如何绕过它(我不能只将 button.addEventListener 标记为 'suspend')
最终流程需要是:用户点击按钮 -> 程序向外部站点发送 http 请求,returns 一个大的 (1000-4000) 列表为简单起见,我们说随机数。 -> 程序然后获取那些返回的号码并为每个号码发送 1 个新的 http 请求(我将不得不弄清楚如何对其进行速率限制)。
我只包含这些额外的信息,这样您就可以获得所有需要的信息来告诉我我需要为事件侦听器做什么,以及我是否使用了正确的异步习惯用法。
您似乎希望按钮触发一些异步操作 activity。一种方法是:
button.addEventListener("click", {
GlobalScope.launch {
// This is a suspend lambda.
// i.e. you can call getBigList here
// The execution will suspend when needed and run until completion
}
})
这里 launch
是来自 kotlinx.coroutines
图书馆的 function。
这类似于在 JS 中调用 async
函数。
我正在为浏览器编写一个针对 KotlinJS 的程序。我不太了解 Kotlinx 的协程,但我需要它们来避免线程冻结 20 分钟。
suspend fun getBigList(ids: bundleID) {
val resp = GlobalScope.async{requestS("URLwithPARAMS${ids}")}
val bigList = resp.await()?.let { it1 -> Json{ignoreUnknownKeys = true}.decodeFromString<LogList>(it1) }
//do something with bigList, or return it and do something in the event listener, either way it will have to be a suspended function that makes HTTP requests based on the bigList
}
//requestS is a synchronous xmlHTTP request. wrapping synchronous with async instead of creating an async xmlHTTP request so that I can await on the response instead of using callbacks.
suspend fun main() {
val button = document.getElementById("mybutton") as HTMLButtonElement
val input = document.getElementById("myinput") as HTMLInputElement
button.addEventListener("click", {
val playerIDs = {/* data class instance derived from input.value */}
getBigList(playerIDs)
})
}
在button.addEventListener中调用getBigList导致错误,Suspension functions can be called only within coroutine body
我明白它为什么这样做(addEventListener 不可暂停),但我不知道如何绕过它(我不能只将 button.addEventListener 标记为 'suspend')
最终流程需要是:用户点击按钮 -> 程序向外部站点发送 http 请求,returns 一个大的 (1000-4000) 列表为简单起见,我们说随机数。 -> 程序然后获取那些返回的号码并为每个号码发送 1 个新的 http 请求(我将不得不弄清楚如何对其进行速率限制)。
我只包含这些额外的信息,这样您就可以获得所有需要的信息来告诉我我需要为事件侦听器做什么,以及我是否使用了正确的异步习惯用法。
您似乎希望按钮触发一些异步操作 activity。一种方法是:
button.addEventListener("click", {
GlobalScope.launch {
// This is a suspend lambda.
// i.e. you can call getBigList here
// The execution will suspend when needed and run until completion
}
})
这里 launch
是来自 kotlinx.coroutines
图书馆的 function。
这类似于在 JS 中调用 async
函数。