Javascript setTimeout()在设置时间之前连续调用回调函数

Javascript setTimeout()在设置时间之前连续调用回调函数,javascript,backbone.js,coffeescript,settimeout,Javascript,Backbone.js,Coffeescript,Settimeout,我试图在我的项目中为注释编辑功能设置计时器,为此,我使用了setTimeout()15分钟。这是我的代码(主干+咖啡脚本): 在我看来,我有- initialize : => @model.bind "change", @render @render() render : => @model.func1() 在模型中- func1: -> if @func2() < 900 console.log 'in func1'


我试图在我的项目中为注释编辑功能设置计时器,为此,我使用了setTimeout()15分钟。这是我的代码(主干+咖啡脚本):

在我看来,我有-

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'

我是不是遗漏了什么?。感谢您的时间。

首先,您很可能设置了许多超时,因为在15分钟的时间范围内,只要模型发生变化,就会调用
setEditTimeOut
。您需要确保在注册新超时之前取消超时:

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
时,使用粗箭头:
func3:=>
首先,您很可能设置了许多超时,因为在15分钟的时间范围内,只要模型发生更改,
setEditTimeOut
就会被调用。您需要确保在注册新超时之前取消超时:

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
时,使用粗箭头:
func3:=>

请使用缩进将代码块标记为代码,而不是反向标记。您的超时是否错误地过大?如果超过27天,它将超过setTimeout可以处理的超时,并立即被调用。不,可以<当剩余时间<15分钟时,调用code>setEditTimeOut。我还尝试给setTimeout一个固定值,比如50000,但运气不好,它仍在调用
func3()
。请使用缩进将代码块标记为代码,而不是反向标记。您的超时是否错误地太大了?如果超过27天,它将超过setTimeout可以处理的超时,并立即被调用。不,可以<当剩余时间<15分钟时,调用code>setEditTimeOut。我还尝试给setTimeout一个固定值,比如50000,但运气不好,它仍在调用
func3()