对于coffeescript中的循环

use*_*non 1 api coffeescript ruby-on-rails-3

我正在使用rails3.2并使用coffeescript

在我的coffeescript中我有一个for循环和每个,我正在执行API调用以获取结果并将结果附加到相应的dom

喜欢

for ajaxLink in _ajaxRenderLinks
      _template = $(ajaxLink).attr('data-link-template')
      apiURL = $(ajaxLink).attr('data-link-url')
      console.log($(ajaxLink))
      Myapp.API.execute(apiURL, 'get', {}, (data) ->
        console.log($(ajaxLink))
        if data isnt "" or data isnt undefined
          console.log($(ajaxLink))
          $(ajaxLink).empty()
          $(ajaxLink).append($(HandlebarsTemplates[Myapp.TemplateRoutes.path(_template)](data))))
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我有两个链接(一个是链接,另一个是ul链接)ajaxRenderLinks有这些a和ul,它有要呈现的模板和获取结果的url.第一个console.log打印第一个链接a,然后为它运行API调用,然后为它运行APi调用,然后打印第二个链接ul并为其运行API CALl.最后它尝试用第二个链接附加最后一个结果,而不是为每个链接添加附加,因为如果数据不是""或者数据不是未定义的话,它内部的ajaxLink仅打印第二个链接而不打印第一个链接然后打印第二个链接

如何解决这个问题

Fla*_*ino 5

看起来像经典的"循环变量闭合"情况.因为该execute函数是异步的,所以它引用ajaxLink,它随循环循环而变化.因此,当execute调用回调时,ajaxLink可能是调用execute自身时的其他内容.

试试这个

for ajaxLink in _ajaxRenderLinks
  do (ajaxLink) ->         # wrap in an immediately-invoked function
    ajaxLink = $(ajaxLink) # save this rather than calling $(...) again and again
    _template = ajaxLink.attr('data-link-template')
    apiURL = ajaxLink.attr('data-link-url')
    Myapp.API.execute(apiURL, 'get', {}, (data) ->
      if data? and data isnt ""
        ajaxLink.empty().append($(HandlebarsTemplates[Myapp.TemplateRoutes.path(_template)](data))))
Run Code Online (Sandbox Code Playgroud)