如何在AJAX请求期间在CoffeeScript中保留父级的上下文

时间:2014-01-15 13:39:29

标签: javascript jquery ajax coffeescript scope

我想浏览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的东西但是如何使用它?

2 个答案:

答案 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)