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()
。