2013-04-25 93 views
0

第一個與第二個不同的是什麼?第一個按預期工作,但第二個沒有達到我期望的水平。在第一個中,我通過callToPhotos間接打電話,但在第二個中,我直接打電話給getPhotos,並通過相冊。 爲什麼以及這有什麼不同?CoffeeScript for循環無法執行多個操作?

$.ajax 
    method:'get' 
    url: '/slides/facebook-albums' 
    success: (albums) -> 
     renderAlbums(albums) 
     callToPhotos(albums) 

renderAlbums = (albums) -> 
    for album in albums 
     $('#facebook .main').append("<div id='#{ album['id'] }' class='album-info'><a class='#{album['id']} fb-album' href='#'>#{album['name']}</a> 
     <img src=#{album['cover_photo']} width='100' height= '100' class='#{album['id']} fb-album'></div>") 

callToPhotos = (albums) -> 
    for album in albums 
     getPhotos(album) 

getPhotos = (album) -> 
     $.ajax 
     method: "get" 
     url: "/slides/#{album['id']}/photos" 
     success: (photos) -> 
      renderPhotos(photos, album['id']) 

-

$.ajax 
    method:'get' 
    url: '/slides/facebook-albums' 
    success: (albums) -> 
     renderAlbums(albums) 
     # callToPhotos(albums) 
     getPhotos(albums) 

renderAlbums = (albums) -> 
    for album in albums 
     $('#facebook .main').append("<div id='#{ album['id'] }' class='album-info'><a class='#{album['id']} fb-album' href='#'>#{album['name']}</a> 
     <img src=#{album['cover_photo']} width='100' height= '100' class='#{album['id']} fb-album'></div>") 

callToPhotos = (albums) -> 
    for album in albums 
     getPhotos(album) 

getPhotos = (albums) -> 
    for album in albums 
     $.ajax 
     method: "get" 
     url: "/slides/#{album['id']}/photos" 
     success: (photos) -> 
      renderPhotos(photos, album['id']) 
+0

它看起來,這些代碼是相似的,他們都需要工作:( – 2013-04-25 08:06:16

回答

1

它與第二片段的循環變量範圍有關。您可以引入一個立即調用函數(IIF)來解決這個問題(在http://coffeescript.org/#loops部分= d的底部閱讀有關do關鍵字):

getPhotos = (albums) -> 
    for album in albums 
    do (album) -> 
     $.ajax 
     method: "get" 
     url: "/slides/#{album['id']}/photos" 
     success: (photos) -> 
      renderPhotos(photos, album['id']) 
    return 

我建議你雖然使用第一種方法,因爲它是與IIF相同,但我認爲更清楚,因爲額外功能現在具有描述性變量名稱;也許聲明getPhotos函數內部的功能:

getPhotos = (albums) -> 
    getAlbum = (album) -> 
    $.ajax 
     method: "get" 
     url: "/slides/#{album['id']}/photos" 
     success: (photos) -> 
     renderPhotos(photos, album['id']) 

    getAlbum album for album in albums 

    return 

(注意,在這兩種情況下,我加入空return,使得它不生成並返回一個數組理解作爲其最後一個表達式= P)

+1

你知道這個答案的規範版本嗎?我敢肯定有數百份同樣的東西,我們都可能回答了幾十個時間:) – 2013-04-25 05:37:24

+1

@ muistooshort,nope。我在想同樣的事情。事實上,我認爲自己「這次我會做一個非常簡短的答案!」...我失敗了= P – epidemian 2013-04-25 05:38:36