coffeescript中array.forEach()的正确语法

viv*_*nov 5 syntax node.js coffeescript

我在coffeescript中有以下代码以递归方式列出目录(从javascript转换):

fs = require 'fs'

walk = (dir, done) ->
  results = []
  fs.readdir dir, (err, list) ->
    return done(err) if err
    pending = list.length
    return done(null, results) unless pending
    list.forEach (file) ->
      file = "#{dir}\\#{file}"
      fs.stat file, (err, stat) ->
        if stat and stat.isDirectory()
          walk file, (err, res) ->
            results = results.concat(res)
            done null, results  unless --pending
        else
          results.push file
          done null, results  unless --pending

walk __dirname, (err, results) ->
  throw err if err
  console.log results
Run Code Online (Sandbox Code Playgroud)

正如你所看到我正在使用list.forEach (file) ->它并且它正在工作.但是当我尝试用它替换它时,for file in list它无法正常工作.我做错了什么?

小智 9

你在循环中定义一个函数.JS中常见的陷阱.你需要关闭迭代器.

for file in list then do (file) =>

  • 在这种情况下,不需要胖箭头,因为循环内部无法访问"this".另外,使用`do` CoffeeScript结构,只是创建函数并在那里调用它来创建新范围的替代方法是自己做:例如:`processFile文件用于列表文件`,其中`processFile`与循环内部完全相同.我认为这种选择在大多数时候都比较清晰. (2认同)