我在咖啡脚本中有一个“类”,其实例变量我想用实例方法初始化,这些实例方法通过回调返回一个值,但它不能像我希望的那样工作:
EventEmitter = require('events').EventEmitter
class MyClass extends EventEmitter
constructor: ->
@datamember: setDatamember()
setDatamember: ->
someFunction (response) ->
@datamember = response
@emit 'init'
getDatamember: ->
return @datamember
----
myObj = new MyClass
myObj.on 'init', ->
console.log myObj.getDatamember
我得到的结果表明setDatamember中的“this”指的是与“this”在对象实例中引用的内容不同的内容。如果我显式调用myObj.setDatamember,我得到了预期的结果,但有没有办法在构造函数中调用set方法 - 特别是通过回调设置数据成员的方法?我查看了docs,以及各种其他咖啡因信息来源(例如this one),我还没有发现任何涉及此事的内容。
答案 0 :(得分:3)
尝试使用胖箭头作为匿名函数:
setDatamember: ->
someFunction (response) =>
@datamember = response
@emit 'init'
此外,您需要在构造函数中调用正确的函数:
constructor: ->
@setDatamember()
一般来说,避免在方法上使用胖箭头 - Coffee-Script实现此方法会对内存使用造成一些不好的影响。此外,它很少是必要的。
但是,引用this
的匿名函数几乎总是需要胖箭头。 this
不像普通变量那样保持在闭包状态,只能通过绑定(Function.prototype.bind
)或通过将其作为对象方法调用来设置(obj.myMethod()
将this
设置为obj
中的myMethod
。
答案 1 :(得分:2)
尝试在除构造函数之外的所有内容上使用胖箭头:
class MyClass
constructor: ->
@setDatamember()
setDatamember: =>
someFunction (response) =>
@datamember = response
getDatamember: =>
return @datamember
但是,您还希望将someFunction
作为异步函数放在那里,这样您就永远无法做到
mc = new MyClass
console.log mc.datamember
因为在访问someFunction
之前,我不会等待mc.datamember
返回。