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 メソッド (特にコールバックを介してデータ メンバーを設定するメソッド) を呼び出す方法はありますか? docsや他のさまざまな coffeescript 情報のソース (例: this one )を調べましたが、これに触れているものは見つかりませんでした。

4

2 に答える 2

3

無名関数に太い矢印を使用してみてください。

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

また、コンストラクターで正しい関数を呼び出す必要があります。

constructor: ->
  @setDatamember()

一般に、メソッドの太い矢印は避けてください。Coffee-Script がこれを実装する方法は、メモリ使用量に悪い影響を与えます。また、必要になることはめったにありません。

ただし、参照する無名関数には、thisほとんどの場合、太い矢印が必要です。 this通常の変数のようにクロージャーに保持されず、バインド ( Function.prototype.bind) またはオブジェクト メソッドとして呼び出す ( inobj.myMethod()に設定thisされる) ことによってのみ設定されます。objmyMethod

于 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 に答える