1

私は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))))

上記のコードでは、2つのリンクがあります(1つはリンクでもう1つはulリンクです)ajaxRenderLinksには、レンダリングするテンプレートと結果をフェッチするURLを持つこれらのaとulがあります。最初のconsole.logは、最初のリンクaを出力し、次にそれに対するAPI呼び出しを実行し、次にそれに対するAPi呼び出しを実行し、次に2番目のリンクulを出力し、それに対してAPICAL1を実行します。そして最後に、最後の結果を2番目のリンクで追加しようとしますが、各リンクの追加は行いません。データが「」でない場合、またはデータが未定義でない場合は、内部のajaxLinkが、2番目のリンクのみを出力し、最初のリンクと2番目のリンクを出力しないためです。

これを解決する方法

4

1 に答える 1

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))))
于 2012-06-11T15:22:20.420 に答える