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. @使用callor强制解决问题apply。这保持assign_token私密,但调用起来更麻烦。

第一个选项如下所示:

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

第二个是(大部分)在你打电话时完成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 回答