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

setTimeout() continuously calling callback function before its set time

本文关键字:连续 调用 回调 函数 时间 设置 setTimeout      更新时间:2024-03-05


我正在尝试为我的项目中的注释编辑功能设置一个计时器,为此我使用了setTimeout()15分钟。这是我的代码(Backbone+Coffee脚本):

在我的主干视图中,我有

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

我是不是错过了什么?。谢谢你抽出时间。

首先,您很可能会设置许多超时,因为在这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: =>