1

我正在使用 rails3.2 并使用咖啡脚本

在我的咖啡脚本中,我有一个 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))))

在上面的代码中,我有两个链接(一个是链接,另一个是 ul 链接) ajaxRenderLinks 有这些 a 和 ul,它们有要渲染的模板和获取结果的 url。第一个console.log 打印第一个链接a,然后对其运行API 调用,然后对其运行API 调用,然后打印第二个链接ul 并为其运行API CALl。最后,它尝试将最后一个结果附加到第二个链接,而不是对每个链接进行附加,因为如果数据不是“”或数据不是未定义,它在里面的 ajaxLink 只打印第二个链接而不打印第一个链接,然后是第二个链接

如何解决这个问题

4

1 回答 1

5

看起来像一个经典的“循环中的变量闭包”情况。因为该execute函数是异步的,所以它引用ajaxLink了 ,它随着循环的循环而改变。因此,当execute调用 's 回调时,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))))
于 2012-06-11T15:22:20.420 回答