2012-11-03 153 views
0

我對js或coffeescript有點新,我不知道我的腳本有什麼問題。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 

我試着去揭露對對象的實例如下界面:令牌got_token的get_token。 由於某種原因,@ token in assign_tokenundefined。我嘗試了一些組合胖箭頭,但無法使其工作。 預先感謝您

回答

2

這是一個簡單的(私人)功能,而不是一個方法:

這是綁定到類專用功能:

f = (arg) => ... 

=>將函數綁定到定義該函數時的任何東西(AKA this)。當你這樣說:

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

@是類Cf被解析,以便f是排序的私有類方法。

最重要的事情是,當你這樣說:

assign_token = (data) => 
    #... 

@assign_token不會是Token一個實例,它實際上是Token本身。您的@token實例中的實例變量Token因此,當您在@中沒有Token的實例時,它當然不會被定義。

你有幾個選擇:

  1. assign_token一個實例方法。這使得assign_token可公開訪問。
  2. 使用callapply強制@問題。這使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方法調用它時,你可以設置想要的@

+0

謝謝,它現在按預期工作。我不知道_call_,我會牢記在心。 – rui