第一个函数运行 - 从未调用

时间:2013-12-12 04:17:10

标签: node.js

我正在通过粉碎node.js - 第一本书示例显示了一个函数,它将所有当前目录文件引入列表,然后运行文件(i),而不调用它。我不知道为什么? - 函数的输入参数在程序中使用并递增,但该值来自何处?首先如何调用此函数?

/**
 * Module dependencies.
 */

var fs = require('fs')
  , stdin = process.stdin
  , stdout = process.stdout

/**
 * Read the current directory.
 */

fs.readdir(__dirname, function (err, files) {
  console.log('');

  if (!files.length) {
    return console.log('    \033[31m No files to show!\033[39m\n');
  }

  console.log('   Select which file or directory you want to see\n');

  // called for each file walked in the directory
  var stats = {};

  function file(i) {

    var filename = files[i];

    fs.stat(__dirname + '/' + filename, function (err, stat) {
      stats[i] = stat;

      if (stat.isDirectory()) {
        console.log('     '+i+'   \033[36m' + filename + '/\033[39m');
      } else {
        console.log('     '+i+'   \033[90m' + filename + '\033[39m');
      }

      if (++i == files.length) {
        read();
      } else {
        file(i);
      }
    });
  }

  // read user input when files are shown
  function read () {
    console.log('');
    stdout.write('   \033[33mEnter your choice: \033[39m');

    stdin.resume();
    stdin.setEncoding('utf8');
    stdin.on('data', option);
  }

  // called with the option supplied by the user
  function option (data) {
    var filename = files[Number(data)];
    if (!filename) {
      stdout.write('   \033[31mEnter your choice: \033[39m');
    } else {
      stdin.pause();

      if (stats[Number(data)].isDirectory()) {
        fs.readdir(__dirname + '/' + filename, function (err, files) {
          console.log('');
          console.log('   (' + files.length + ' files)');
          files.forEach(function (file) {
            console.log('     -   ' + file);
          });
          console.log('');
        });
      } else {
        fs.readFile(__dirname + '/' + filename, 'utf8', function (err, data) {
          console.log('');
          console.log('\033[90m' + data.replace(/(.*)/g, '     $1') + '\033[39m');
        });
      }
    }
  }

  // start by walking the first file
  file(0);
});

1 个答案:

答案 0 :(得分:1)

我一定是在误解你的问题......因为这似乎很简单。

底部的一行:

// start by walking the first file
file(0);

该行是否“启动”文件(i)链。该行位于fs.readdir回调的底部,并在fs.readdir回调主体中定义其他函数和变量后到达该点时调用。

我错过了你的问题吗?