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 回答