使用Node.js步骤模块中的参数调用下一步

使用Node.js步骤模块中的参数调用下一步,node.js,Node.js,我刚刚开始使用Step,我正在尝试获取目录中所有文件的stat信息 然而,当我在第二步调用fs.stat时,我仍然需要完整的路径。如何将其传递到下一个方法?我尝试了这个(目录),但它没有像我预期的那样工作 var getFiles = step.fn( function readDir(directory) { var p = path.join(__dirname, directory); fs.readdir(p, this); // *** How

我刚刚开始使用Step,我正在尝试获取目录中所有文件的
stat
信息

然而,当我在第二步调用fs.stat时,我仍然需要完整的路径。如何将其传递到下一个方法?我尝试了
这个(目录)
,但它没有像我预期的那样工作

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
的回调只被调用一次,带有一个文件数组。

您可以使用范围在getFiles之外的变量(hacky),也可以使用闭包

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

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

这只是一个函数。您可以显式地调用它。

您可以始终使用Q-Oper8:


然后您可以安全地使用sync-fs方法,这可能会使您更容易完成想要完成的任务。

我最终切换到了Async。这是炸弹,我完全不同意。外部作用域变量不是坏事,但需要正确执行。范围查找是昂贵的;但是,通过创建作用域变量的局部引用,实际上没有问题。关于切换到异步:根据我的经验,使用Step可以比使用异步更优雅地表达一些东西。不过,这并不完美,一个结合了他们的想法和功能的图书馆也不错。最大的事实是,尽管单线程环境使很多事情变得更容易,但我仍然不能说它总的来说很容易。