1


プロジェクトでコメント編集機能のタイマーを設定しようとしています。このため、setTimeout()を15分間使用しました。これが私のコードです(Backbone + Coffee-script):

私のバックボーンビューでは-

initialize : =>  
  @model.bind "change", @render  
  @render() 

render : =>  
  @model.func1()

モデル内-

func1: ->  
  if @func2() < 900
    console.log 'in func1'
    @setEditTimeOut()

func2: ->
# this returns total time left (in seconds) for a comment to edit

setEditTimeOut: ->
  console.log 'here in set time out'
  setTimeout (=> @func3()), @func2()*1000

func3 : ->  
  console.log 'in func3'  
  @.trigger 'change'

問題は、一定の間隔の後に繰り返しsetTimeOut呼び出すことですfunc3()。console.logを配置して呼び出しシーケンスを確認しようとしましたが、一定の間隔の後にこれを取得しています。

in func3  
in func1  
here in set time out

私はここで何かが足りないのですか?御時間ありがとうございます。

4

1 に答える 1

1

setEditTimeOutまず、 15分の時間枠内でモデルに変更があった場合はいつでも呼び出されるため、多くのタイムアウトを設定している可能性が非常に高くなります。新しいタイムアウトを登録する前に、必ずタイムアウトをキャンセルする必要があります。

setEditTimeOut: ->
  console.log 'here in set time out'
  clearTimeout(@timeoutHandle) if @timeoutHandle
  @timeoutHandle = setTimeout (=> @func3), @func2()*1000

次に、(あなたの説明に基づいて)タイムアウトハンドラーの間にタイムアウトを登録していないことを確認する必要があります。

func3 : ->  
  @inCallback = true
  console.log 'in func3'  
  @.trigger 'change'
  @inCallback = false

setEditTimeout: ->
  return if @inCallback
  # ...

最後の注意点...あなたのコールバック(=> @func3)が本当に奇妙なことを言っていることに気づきました(それはまったく機能しないはずです。これはタイプミスですか?少なくとも読む必要があります(=> @func3()))。代わりに、私はあなたが望むsetTimeout @func3, @func2()*1000と思います、そしてあなたが定義するときfunc3、太い矢印をuweします:func3: =>

于 2012-07-27T09:57:07.963 に答える