我想浏览CoffeeScript中的一个对象,对于该对象中的每个项目,我想进行一次AJAX调用(使用jQuery)。在AJAX调用的回调机制中,我想打印导致请求的项的数据,但在我的回调中,我丢失了对初始上下文的引用。上下文总是一样的:
data =
one:
id: 1
two:
id: 2
three:
id: 3
four:
id: 4
five:
id: 5
callback = (data, textStatus, jqXHR) ->
console.log value.id # It's always "5" :-(
for key, value of data
$.get ".", callback
我如何保持上下文?我已经尝试使用fat arrow
进行回调,但这没有用。 I read有一种名为$.proxy
的东西但是如何使用它?
答案 0 :(得分:4)
您还可以将其包装在立即函数中并在此上下文中存储变量:
for key, value of data
(->
val = value
callback = (data, textStatus, jqXHR) ->
console.log val.id
$.get ".", callback
)()
请注意,使用此方法,您必须在调用之前首先声明回调。
但是最可靠的是“coffeescript方式”,使用 do 关键字,它会立即调用传递的函数,转发任何参数:
for key, value of data
do (value)->
callback = (data, textStatus, jqXHR) ->
console.log value.id
$.get ".", callback
实现这一目标的另一种方法是使用jQuery的each函数进行迭代:
$.each data, (index, value) ->
callback = (data, textStatus, jqXHR) ->
console.log value.id
$.get ".", callback
答案 1 :(得分:0)
确定。我解决了将$.get
替换为$.ajax
然后使用context
属性的问题。但是还有一种CoffeeScript方式吗?因为我的解决方案依赖于jQuery。
data =
one:
id: 1
two:
id: 2
three:
id: 3
four:
id: 4
five:
id: 5
callback = (data, textStatus, jqXHR) ->
console.log @id
for key, value of data
$.ajax
url: "."
type: "GET"
context: @value
.always(callback)