【问题标题】:For loop in coffeescript咖啡脚本中的for循环
【发布时间】:2012-06-14 12:01:46
【问题描述】:

我正在使用 rails3.2 并使用 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))))

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

如何解决这个问题

【问题讨论】:

    标签: ruby-on-rails-3 api coffeescript


    【解决方案1】:

    看起来像一个经典的“循环中的变量闭包”情况。因为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))))
    

    【讨论】:

    • 对此+1。有关在具有异步行为的循环中使用 do 的更多信息,请参阅我的文章 A CoffeeScript Intervention
    • @TrevorBurnham 谢谢!来自真正写这本书的人(我发誓,我一直想读!),这是一个巨大的+1! :)
    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多