2012-06-11 47 views
1

我對rails3.2工作循環,並利用CoffeeScript的對於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)))) 

在上面的代碼,我有兩條鏈路(一個是一個鏈接,另一個是UL鏈路) ajaxRenderLinks具有這些一個和UL具有其模板來呈現和鏈接直接取得結果。 第一個console.log打印第一個鏈接a,然後爲其運行API調用,然後運行它的APi調用 ,然後打印第二個鏈接ul併爲其運行API CALl。最後它會嘗試追加第二個鏈接的最後結果,而不是爲每個鏈接添加附加內容,因爲如果data isnt「」或數據isnt未定義,那麼它內部的ajaxLink僅打印第二個鏈接,而不打印第一個鏈接,然後打印第一個鏈接,然後打印第二個鏈接

如何解決這個

回答

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)))) 
+0

+1了這一點。有關在具有異步行爲的循環中使用'do'的更多信息,請參閱我的文章[CoffeeScript Intervention](http://pragprog.com/magazines/2011-05/a-coffeescript-intervention)。 –

+0

@TrevorBurnham謝謝!來自字面上寫這本書的人(我發誓,我一直有意讀!),這是一個強大的+1! :) – Flambino

+0

@Flambino謝謝 – useranon