2

クラス内で setInterval を実行しようとしていますが、以下のコードは、車が作成されるときにその updatePosition への呼び出しが定期的に呼び出されるという意味で正常に機能します。

問題は、setInterval の「スコープ」で @currentSpeed 変数の値を取得できないことです。代わりに、updatePosition 関数が間隔で呼び出されると、console.log に「Updating position: Speed: undefined」が表示されます。

加速()関数(加速ボタンを押すたびに呼び出される)を呼び出すと、期待される @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}"
4

2 に答える 2

3
setInterval (=> @updatePosition()), intervalMs
于 2012-06-16T01:04:26.300 に答える
2

do => @updatePositionコールバックを作成する意味はありません。これは、(キーワード=>によって)すぐに実行されdo、関数を返す関数()を作成するため@updatePositionです。したがって、これをに簡略化できます@updatePosition

別の場所では太い矢印が必要です。@currentSpeedの値を取得するには、updatePosition()が現在のインスタンスにアクセスする必要がありますが、この関数が常に正しいコンテキストで呼び出されることを保証できないため、次のことを行う必要があります。太い矢印を使用して、この関数にバインドします。

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

updatePosition: () =>
    console.log("Updating position: Speed: #{@currentSpeed}")
于 2012-06-16T01:01:22.033 に答える