0

私はjsまたはcoffeescriptに少し慣れていないので、スクリプトの何が問題なのかわかりません。

class Token

  fetching_token = $.Deferred()
  assigning_token = $.Deferred()

  constructor: ->
    @token = null
    @got_token = $.Deferred()    

  fetch = ->
    fetching_token.resolve({"access_token": '12355'})

  assign_token = (data) =>
    console.log "TOKEN (instance var): " + @token #undefined? 
    @token = data.access_token
    assigning_token.resolve()

  get_token: ->
    fetch()
    $.when(fetching_token).done (data) =>
      assign_token(data)
    $.when(assigning_token).done =>
      @got_token.resolve()
    undefined


t = new Token
t.get_token()

$.when(t.got_token).done ->
  console.log "FETCHED TOKEN: " + t.token #gives null

オブジェクトのインスタンスで次のインターフェイスを公開しようとしています: tokengot_tokenget_token。何らかの理由で、assign_token@tokenundefinedです。ファットアローとの組み合わせをいくつか試しましたが、うまくいきませんでした。前もって感謝します

4

1 に答える 1

2

これは単純な (プライベート) 関数であり、メソッドではありません。

f = (arg) -> ...

これは、クラスにバインドされたプライベート関数です。

f = (arg) => ...

は、関数が定義されているときに関数を(AKA )=>にバインドします。あなたがこれを言うとき:@this

class C
    f = (arg) => ...

@が解析されているCときのクラスなので、一種のプライベート クラス メソッドです。ff

重要なことは、あなたがこれを言うときです:

assign_token = (data) =>
  #...

@insideassign_tokenは のインスタンスではなく、Token実際にはTokenそれ自体になります。Yourはインスタンス@tokenのインスタンス変数であるため、 inのインスタンスがない場合はもちろん定義されません。TokenToken@

いくつかのオプションがあります。

  1. インスタンスassign_tokenメソッドを作成します。これにより、assign_token公開アクセスが可能になります。
  2. または@を使用して問題を強制します。これは非公開に保ちますが、呼び出すのはより面倒です。callapplyassign_token

最初のオプションは次のようになります。

assign_token: (data) ->
    # Same stuff you already have

2 番目の処理は、次の呼び出し時に (ほとんど) 行われますassign_token

assign_token = (data) ->
    # Same stuff you already have

get_token: ->
  fetch()
  $.when(fetching_token).done (data) =>
    assign_token.call(@, data)
  #...

->を定義するときの細い矢印 ( ) に注意してください。assign_tokenこれにより、単純な関数が得られるため、関数のメソッド@で呼び出したときに目的の関数を設定できます。call

于 2012-11-03T19:41:31.893 に答える