1

我在咖啡脚本中有一个“类”,我想用实例方法初始化它的实例变量,这些实例方法通过回调返回一个值,但它不像我希望的那样工作:

  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 方法——特别是通过回调设置数据成员的方法?我浏览了文档,以及各种其他的咖啡脚本信息来源(例如这个),我还没有找到任何涉及到这一点的东西。

4

2 回答 2

3

尝试对匿名函数使用粗箭头:

setDatamember: ->
  someFunction (response) =>
    @datamember = response
    @emit 'init'

此外,您需要在构造函数中调用正确的函数:

constructor: ->
  @setDatamember()

一般来说,避免方法上的粗箭头——Coffee-Script 实现这一点的方式对内存使用有一些不好的影响。此外,它很少是必要的。

但是,引用的匿名函数this几乎总是需要粗箭头。 this不像普通变量那样保持在闭包中,只能通过绑定(Function.prototype.bind)或通过将其作为对象方法调用(obj.myMethod()将设置thisobjin myMethod)来设置。

于 2013-09-17T21:54:02.227 回答
2

尝试在除构造函数之外的所有内容上使用粗箭头:

 class MyClass
    constructor: ->
      @setDatamember()

    setDatamember: =>
      someFunction (response) =>
        @datamember = response

    getDatamember: =>
      return @datamember

但是,您还希望将someFunction其中的异步函数作为异步函数,因此您永远无法做到

mc = new MyClass
console.log mc.datamember

因为在访问之前不会等待someFunction返回mc.datamember

于 2013-09-10T23:18:34.287 回答