2012-05-09 3 views
3

coffeescript가 표준 인 새로운 Play20 사이트를 프로그래밍하면서 지난 주에 coffeescript를 쓰기 시작했습니다. 5 분마다 내 클래스에서 getData 함수를 업데이트하려고하지만 setInterval 함수가 내 클래스에 바인딩되지 않습니다. setUpdateInterval() 함수가 생성자 내에서 호출되므로 'this'객체에 계속 도달 할 수 있으므로 처음으로 getData를 호출합니다.Coffeescript setInterval in class

하지만 첫 번째 호출 후에 setInterval은 위젯 인스턴스와 더 이상 연결되지 않으며 this.getData() 함수가 무엇인지 (도달하는 방법)를 알지 못합니다.

누군가 어떻게하는지 알고 있습니까?

class Widget 
    constructor: (@name) -> 
    this.setUpdateInterval() 

    getData: -> 
    console.log "get Data by Ajax" 

    setUpdateInterval: (widget) -> 
    setInterval(this.getData(), 3000000) 

답변

5

여기에 자바 스크립트가 필요합니다. 기능이 다르게 결합되어야 할 것이다, 그래서 Reference

class Widget 
    constructor: (@name) -> 
    this.setUpdateInterval() 

    getData: -> 
    console.log "get Data by Ajax" 

    setUpdateInterval: (widget) -> 
    callback = @getData.bind(this) 
    setInterval(callback, 3000000) 

이, 거의 모든 브라우저를 (어느하지 추측) 작동합니다. 일부 커피 스크립트 마법 :

callback = => @getData 
+0

당신은'cb = @ getData.bind @'와 같은 바인드 호출을 할 수 있으며,'setInterval' 라인에 괄호가 필요하지 않습니다 ... more coffee. +1, IE에서 작동하지 않는다는 사실을 제외하고이 답변이 내 것보다 낫다. – hvgotcodes

+0

감사합니다. 코드는 내가 원했던 것과 정확히 똑같습니다 (Chrome). '콜백 = -> that.getData.call (그)'는 컴파일되지 않는 것 같습니다. 다음 질문은 바꿔서 differtly 당신은 내가 IE를 제외한 모든 브라우저를위한 하나의 IE를위한 두 개의 바인딩이 필요하다는 뜻입니까 아니면 그냥 마지막 바인딩이 필요합니까? 여기에 – Jacob

+0

@ user1353536이 컴파일됩니다. – Reactormonk

3

문제는 당신이 기능을 실행하는 대신에 대한 참조를 전달하는 것입니다 :

여기 내 코드입니다.

이제는 인스턴스의 범위를 유지해야하는 것처럼 들립니다. do=>이 도움이 될 수 있습니다.

setUpdateInterval: (widget) -> 
    setInterval (do => 
     @getData), 3000000 
    true 

로 컴파일
Widget.prototype.setUpdateInterval = function(widget) { 
     var _this = this; 
     setInterval((function() { 
     return _this.getData; 
     })(), 3000000); 
     return true; 
    }; 

코드를주의 할 것이다는 _this로 콜백의 범위로 잠금 주위 this을 폐쇄을 생성하는 기능을 반환 자체 호출 기능을, (실행)

위젯을 메소드에 전달할 필요가 없으며 (어디에서나 사용하고 있지는 않음) 생성자에서이 함수를 호출하여 간격을 설정할 수 있습니다. 무엇을 하든지이 메서드를 한 번만 호출하면됩니다. 함수의 내용을 생성자에 넣을 수 있습니다.

마지막으로 coffeescript는 모든 함수에서 마지막 명령문의 값을 반환하기 때문에 여기에 true을 던지지만 그럴 필요는 없습니다.

0

이것은 노드에서도 유용합니다. 그것은 Tass의 대답을 변형시킨 것입니다.

class Widget 
    constructor: (@options = {}) -> 
    @options.interval ?= 1000 
    @setInterval() 

    timer: -> 
    console.log 'do something' 

    setInterval: -> 
    cb = @timer.bind @ 
    setInterval cb, @options.interval 

w = new Widget()