0

我有以下错误:

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"
  }
)

当我关闭运行应用程序的选项卡时出现错误。尽管选项卡已关闭,但计时器似乎仍在继续工作。

我怎样才能阻止它?

谢谢,

开曼

4

1 回答 1

1

您有几种方法可以解决您的问题。第一个是在您的计划函数启动异常时显式停止计时器。这给出了类似的东西:

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
}

但是问题来了,因为您的计时器是在服务器端执行的(因为它是由 start 函数创建的)。

因此,更好的解决方法是在客户端设置您的计时器。你有几种方法可以做到这一点。

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

}

于 2012-04-27T16:45:01.183 回答