【问题标题】:How can I make a callback in CoffeeScript如何在 CoffeeScript 中进行回调
【发布时间】:2013-10-24 21:56:27
【问题描述】:

我在 node.js 中混合了一些代码,它允许我创建目录的无序列表。我想要的是父循环函数暂停并等待子循环完成,然后继续执行代码。

这是我的代码:

listFolders = (dir, callback) ->
  readDir = "#{__dirname}/public/#{dir}"
  fs.readdir readDir, (err, files) ->
  files.forEach (file) ->
    dirname = file
    path = "#{dir}/#{file}"
    readPath = "#{readDir}/#{file}"

    fs.stat readPath, (err, stat) ->
      if stat && stat.isDirectory()
        console.log "<li class='folder' data-path='#{dir}' data-name='#{dir}/#{dirname}'><span>#{dirname}</span><ul>"
        listFolders path, () ->
          console.log "</ul></li>"
      else if stat && stat.isFile()
        console.log "<li class='file' data-path='#{dir}' data-filename='#{dirname}'><span>#{dirname}</span></li>"

  return callback

如你所见,我试图给函数一个回调,但是当我使用它时

listFolders path, () ->
  console.log "</ul></li>"

控制台日志从未运行,也没有暂停我的代码。

我正在扫描的文件夹的输出是

<li class='file' data-path='/user_projects/1' data-filename='.DS_Store'><span>.DS_Store</span></li>
<li class='folder' data-path='/user_projects/1' data-name='/user_projects/1/assets'><span>assets</span><ul>
<li class='file' data-path='/user_projects/1' data-filename='index.html'><span>index.html</span></li>
<li class='folder' data-path='/user_projects/1/assets' data-name='/user_projects/1/assets/css'><span>css</span><ul>
<li class='file' data-path='/user_projects/1/assets' data-filename='test.php'><span>test.php</span></li>
<li class='file' data-path='/user_projects/1/assets/css' data-filename='main.css'><span>main.css</span></li>

应该是的

<li class='file' data-path='/user_projects/1' data-filename='.DS_Store'><span>.DS_Store</span></li>
<li class='folder' data-path='/user_projects/1' data-name='/user_projects/1/assets'><span>assets</span><ul>
    <li class='folder' data-path='/user_projects/1/assets' data-name='/user_projects/1/assets/css'><span>css</span><ul>
       <li class='file' data-path='/user_projects/1/assets' data-filename='test.php'><span>test.php</span></li>
       <li class='file' data-path='/user_projects/1/assets/css' data-filename='main.css'><span>main.css</span></li>
    </ul></li>
</ul></li>
<li class='file' data-path='/user_projects/1' data-filename='index.html'><span>index.html</span></li>

我已经被这个问题困扰了一段时间,希望有人能帮助我。非常感谢您的帮助。

>>>>>使用 forEachSeries 进行更新

我现在正在使用下面提供的代码

listFolders = (dir, callback) ->
  readDir = "#{__dirname}/public/#{dir}"
  fs.readdir readDir, (err, files) ->
    async.forEachSeries files, (file, callback) ->
      dirname = file
      path = "#{dir}/#{file}"
      readPath = "#{readDir}/#{file}"

      fs.stat readPath, (err, stat) ->
        if stat && stat.isDirectory()
          console.log "<li class='folder'><span>#{dirname}</span><ul>"
          listFolders path, () ->
            console.log "</ul></li>"
            callback()
        else if stat && stat.isFile()
          console.log "<li class='file'><span>#{dirname}</span></li>"
          callback()
  , callback

我的输出不是我想要的,而是这个(关闭 'ul' 和 'li' 没有显示):

<li class='file' data-path='/user_projects/1' data-filename='.DS_Store'><span>.DS_Store</span></li>
<li class='folder'><span>assets</span><ul>
    <li class='folder'><span>css</span><ul>
        <li class='file'><span>main.css</span></li>

我在目录中的文件夹现在应该显示为

- .ds_store
- asstets
  - css
    - main.css
  - test.php
- index.html

【问题讨论】:

    标签: javascript jquery node.js coffeescript filetree


    【解决方案1】:

    你传入了一个函数callback,但你从来没有调用它。你只是退货。您可能想查看async.js 之类的内容。然后你会写出类似这样的代码:

    listFolders = (dir, callback) ->
      readDir = "#{__dirname}/public/#{dir}"
      fs.readdir readDir, (err, files) ->
        async.forEachSeries files, (file, callback) ->
          dirname = file
          path = "#{dir}/#{file}"
          readPath = "#{readDir}/#{file}"
    
          fs.stat readPath, (err, stat) ->
            if stat && stat.isDirectory()
              console.log "<li class='folder' data-path='#{dir}' data-name='#{dir}/#{dirname}'><span>#{dirname}</span><ul>"
              listFolders path, () ->
                console.log "</ul></li>"
                callback()
            else if stat && stat.isFile()
              console.log "<li class='file' data-path='#{dir}' data-filename='#{dirname}'><span>#{dirname}</span></li>"
              callback()
      , callback
    

    【讨论】:

    • 使用 npm 安装,我在服务器文件中需要什么,因为目前我收到 ReferenceError:_ 不是从“_.forEach”部分定义的。抱歉在 node.js 有点新
    • 我不知道如何使用coffeescript,但在普通的javascript中,这看起来像var async = require('async'); async.forEach(yourArray, yourIteratorFunction, finalCallbackFunction),请参阅async docs
    • 我也很确定 _.forEach 必须缩进才能使用文件变量。如果我错了,你能纠正我吗?这是我可能出错的地方?
    • @JosephSmith127 我基于您的原始代码,它具有相同的缩进问题。另外,我不小心使用了_ 而不是async。回调中的console.log 现在正在运行吗?
    • @JosephSmith127 您应该尝试像我一样缩进倒数第二行 (callback())。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2012-05-01
    • 2013-06-19
    相关资源
    最近更新 更多