我对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
我试图在对象实例上公开以下界面:令牌, got_token , get_token 。 由于某种原因, assign_token 中的 @token 是 undefined 。我尝试了一些与胖箭头的组合,但无法使其工作。 提前谢谢
答案 0 :(得分:2)
这是一个简单的(私有)函数,而不是方法:
f = (arg) -> ...
这是绑定到类的私有函数:
f = (arg) => ...
=>
将函数绑定到函数定义时的@
(AKA this
)。当你这样说:
class C
f = (arg) => ...
在解析@
时, C
是类f
,因此f
是一种私有类方法。
重要的是,当你这样说时:
assign_token = (data) =>
#...
@
内的 assign_token
不会是Token
的实例,实际上它本身就是Token
。您的@token
是Token
的实例上的实例变量,因此当Token
中没有@
的实例时,它未定义1}}。
您有几个选择:
assign_token
成为实例方法。这使得assign_token
可以公开访问。call
或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
),它为您提供了一个简单的功能,以便您在使用函数{{1}调用它时可以设置所需的@
方法。