CoffeeScript for循环不能执行多个操作

CoffeeScript for loops can't take multiple actions?

本文关键字:操作 执行 不能 for 循环 CoffeeScript      更新时间:2023-09-26

第一个和第二个有什么不同?第一个按预期工作,但第二个没有做我所期望的。在第一个中,我通过calltopphotos间接地进行调用,但在第二个中,我直接调用getPhotos并传入相册。为什么和如何不同?

$.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'])

这与第二个代码片段循环中的变量作用域有关。您可以引入一个立即调用的函数(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)