问题描述
我有一个 kotlinjs 应用程序。我像这样处理一个特定的事件(将数据放到组件上):
onEvent {
drop = { event ->
GlobalScope.async {
//...
dropTask(y,data)
}
}
}
// ...
// this function has to be a suspend function because model's is
private suspend fun dropTask(y: Int,taskId: TaskId) {
// ... prepare data
model.insertBefore(taskId!!,insertBefore?.id)
}
// ... Model's function is defined like this:
suspend fun insertBefore(taskToInsert: TaskId,taskBefore: TaskId?) {
val (src,_) = memory.find(taskToInsert)
// ... and finally,the find function is:
fun find(taskId: TaskId): Pair<Task?,Int> {
// ...
return if (task != null) {
// ...
} else {
throw Exception("Couldn't find task with id $taskId!!")
}
}
问题是抛出异常,但没有在任何地方报告。
我试过了:
a) 将 CoroutineExceptionHandler 安装到 GlobalScope.async 中(即:
val handler = CoroutineExceptionHandler { _,e ->
console.log("Caught exception: $e")
}
GlobalScope.async(handler) {
...但这永远不会被调用。如果我可以让它工作,这将是相对干净的。如果这是 kotlinjs 的默认行为会更好,这样就不会意外地未报告异常。
b) 调用等待:
drop = { event ->
GlobalScope.launch {
GlobalScope.async() {
// ...
dropTask(y,data)
}.await()
}
}
这确实导致异常被记录到控制台,但它太难看了。不可能在挂起函数或协程之外调用 .await(),因此对于这个特定的事件处理程序,我必须在启动中包装异步调用。我一定做错了什么。有人有我应该使用的更好的模式吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)