如何在coffeescript类中使用setInterval作用域?

时间:2012-06-16 00:54:18

标签: coffeescript setinterval

我正在尝试在类中执行setInterval,并且下面的代码工作正常,因为在创建汽车时会定期调用其updatePosition。

问题是我无法在setInterval“scope”中获取@currentSpeed变量的值。相反,当我按照时间间隔调用updatePosition函数时,我的console.log中会出现“正在更新位置:速度:未定义”。

当我调用accele()函数(随时调用加速按钮时调用)它会返回预期的@currentSpeed值

如何从setInterval范围中获取@currentSpeed的值?

以下是我的代码的相关部分:

class Car
    constructor: () ->    
        @currentSpeed = 0

        intervalMs = 1000
        @.setUpdatePositionInterval(intervalMs)

    setUpdatePositionInterval: (intervalMs) ->
        setInterval (do => @updatePosition ), intervalMs

    updatePosition: () ->
        # below logs: "Updating position: Speed: undefined"
        console.log("Updating position: Speed: #{@currentSpeed}")

    accelerate: () ->
        #below logs the expected value of @currentSpeed
        console.log "ACCELERATING! CurrentSpeed: #{@currentSpeed}"

2 个答案:

答案 0 :(得分:3)

setInterval (=> @updatePosition()), intervalMs

答案 1 :(得分:2)

执行do => @updatePosition创建回调没有意义 - 因为这会创建一个立即执行的函数(=>)(由于do关键字)并返回函数@updatePosition。因此,您可以将其简化为@updatePosition

在另一个位置需要胖箭头:updatePosition()需要访问当前实例,以便检索@currentSpeed的值 - 但是由于您无法确保始终在正确的上下文中调用此函数,你需要使用胖箭头将它绑定到这个函数:

setUpdatePositionInterval: (intervalMs) ->
    setInterval @updatePosition, intervalMs

updatePosition: () =>
    console.log("Updating position: Speed: #{@currentSpeed}")