我有以下错误:
Error: uncaught OPA exception {OpaRPC_Server: {timeout: {client: {client: $"j98soqx7hbavgq2scg915j7mlkctdeop"$; page: $1
042254815$}; fun_id: $"_v0_get_value_stdlib.core.xhtml"$}}}
使用下面的简单代码:
function start()
{
content = <textarea style="width:30%;" rows=1 id=#text > text </textarea> <+>
<div id=#copy></div>
Scheduler.timer(3000, function() {#copy =+ Dom.get_value(#text)})
content
}
Server.start(
Server.http,
{ page:start,
title:"bug timer"
}
)
当我关闭运行应用程序的选项卡时出现错误。尽管选项卡已关闭,但计时器似乎仍在继续工作事件。
我怎样才能阻止它?
谢谢
凯曼
您有几种方法可以解决问题。第一个是在调度函数启动异常时显式停止计时器。这给出了这样的东西:
function start()
{
content = <textarea style="width:30%;" rows=1 id=#text > text </textarea> <+>
<div id=#copy></div>
recursive timer =
Scheduler.make_timer(3000, function() {
@catch(function(exn){Log.error("EXN", "{exn}"); timer.stop()},
#copy =+ Dom.get_value(#text))
}
)
content
}
但是问题来了,因为你的计时器是在服务器端执行的(因为它是由启动函数创建的)。
因此,更好的解决方法是在客户端设置计时器。您有几种方法可以做到这一点。
1 - 只需标记您的计时器@client,它将在客户端顶层执行。但它有点"暴力"。因为它将在所有页面上启动。
@client x = Scheduler.timer(3000, function() {#copy =+ Dom.get_value(#text)})
2 - 在 onready 事件中启动,计时器将在div #copy 准备就绪时启动。
function start()
{
content = <textarea style="width:30%;" rows=1 id=#text > text </textarea> <+>
<div id=#copy onready={function(_){
Scheduler.timer(3000, function() {#copy =+ Dom.get_value(#text)})
}}
></div>
Scheduler.timer(3000, function() {#copy =+ Dom.get_value(#text)})
content
}