我上周开始写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 )
答案 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答案的变体。