Class coffeescript访问实例变量
我对js或coffeescript有些陌生,我不知道我的脚本有什么问题Class coffeescript访问实例变量,class,scope,coffeescript,instance,Class,Scope,Coffeescript,Instance,我对js或coffeescript有些陌生,我不知道我的脚本有什么问题 class Token fetching_token = $.Deferred() assigning_token = $.Deferred() constructor: -> @token = null @got_token = $.Deferred() fetch = -> fetching_token.resolve({"access_token": '
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
我试图在对象的实例上公开以下接口:token、get\u token、get\u token。
由于某些原因,assign_token中的@token未定义。我尝试了一些与胖箭的组合,但没有成功。
提前感谢这是一个简单的(私有)函数,不是一种方法:
f = (arg) -> ...
这是绑定到类的私有函数:
f = (arg) => ...
定义函数时,=>
将函数绑定到任何@
(又称此
)上。当你这么说的时候:
class C
f = (arg) => ...
assign_token = (data) =>
#...
@
是解析f
时的类C
,因此f
是一种私有类方法
重要的是,当你这么说的时候:
class C
f = (arg) => ...
assign_token = (data) =>
#...
@
内部分配令牌
不会是令牌
的实例,它实际上是令牌
本身。您的@token
是token
实例上的一个实例变量,因此当您在@
中没有token
实例时,当然不会定义它
您有两个选择:
assign_token
成为一个实例方法。这使得assign\u令牌
可以公开访问@
问题。这使得assign\u令牌保持私有,但调用起来更麻烦
assign_token: (data) ->
# Same stuff you already have
当您调用assign\u token
时,第二个开启(大部分)完成:
assign_token = (data) ->
# Same stuff you already have
get_token: ->
fetch()
$.when(fetching_token).done (data) =>
assign_token.call(@, data)
#...
请注意,在定义
分配令牌
时,有一个细长的箭头(->
),它为您提供了一个简单的函数,以便您可以在使用函数的调用
方法调用时设置所需的@
。谢谢,它现在可以正常工作了。我不知道这个电话,我会记住的。