2011-09-11 56 views
1

我刚开始使用Step,并试图获取目录中所有文件的stat信息。使用Node.js中的参数调用下一步步骤模块

但是,由于我在第二步中打电话给fs.stat,我仍然需要完整路径。我如何将它传递给下一个方法?我试过this(directory),但没有按预期工作。

var getFiles = step.fn(
    function readDir(directory) { 
     var p = path.join(__dirname, directory); 
     fs.readdir(p, this); // *** How do I pass 'directory' to the next method? 
    }, 

    function readFiles(err, results, directory) { 
     if (err) throw err; 
     // Create a new group 
     var group = this.group(); 
     results.forEach(function (filename) { 
      console.log(filename); 
      var p = path.join(__dirname, directory, filename); 
      // fs.stat requires a full path 
      fs.stat(p, group()); // Could be this.parallel() ?? 
     }); 
    } 
); 

// later... 
var files = getFiles('data'); 

据我了解,readDir被调用一次,然后readFiles被调用,但在所有系列作为fs.readdir的回调只是被调用一次,文件的数组。

回答

1

你可以在getFiles(hacky)之外使用一个变量作用域,或者你也可以使用闭包。

个人而言,我会从步骤切换到异步(https://github.com/caolan/async)。 async中提供的瀑布方法是您真正需要的。异步具有与步骤等相同的功能。

+0

我结束了交换到异步。这是炸弹。 –

+0

我完全不同意。外部范围变量不是一件坏事,但需要正确完成。范围查找非常昂贵;但通过创建一个局部变量的范围变量,真的没有问题。关于切换到异步:根据我的经验,使用Step可以比异步更优雅地表达某些内容。尽管如此,还不够完美,而一个将他们的想法和功能相结合的图书馆将会很好。最重要的事实是,尽管单线程环境可以使许多事情变得更容易,但我仍然不会总称它很容易。 –

1
fs.readdir(p, (function(err, files) { 
    this(err, files, directory); 
}).bind(this)); 

this仅仅是一个函数。你可以明确地调用它。