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

問題を解決する方法はいくつかあります。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 に答える