课堂上的Coffeescript setInterval

时间:2012-05-09 12:09:44

标签: coffeescript setinterval

我上周开始写coffeescript,因为我正在编写一个新的Play20网站,其中coffeescript是标准。我想每隔5分钟在我的类中更新一个getData函数,但是setInterval函数不会绑定到我的类。只是第一次调用getData,因为'this'对象仍然可以访问,因为从构造函数中调用了setUpdateInterval()函数。

但是在第一次调用之后,setInterval不再与Widget实例有任何连接,并且不知道this.getData()函数是什么(以及如何到达它)。

有人知道怎么做吗?

这是我的代码:

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

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

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

3 个答案:

答案 0 :(得分:7)

现在这里需要一些Javascript魔法。 Reference

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

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

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

这几乎适用于所有浏览器(猜不到哪一个),所以 函数必须以不同的方式绑定。一些coffeescript魔术:

callback = => @getData

答案 1 :(得分: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,但这可能没有必要。

答案 2 :(得分:0)

这在节点中也很方便。这是Tass答案的变体。