2011-09-11 57 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僅僅是一個函數。你可以明確地調用它。