2013-04-25 94 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