2013-10-31 62 views
0

我需要一點幫助理解如何複製我想作爲模塊傳遞的函數的結果.exports ..有一個全局和局部範圍的問題在這裏:節點js - 模塊範圍與函數的變量和結果

// Declare node.js module dependencies from API 
var walk = require('walk'), 
    filter; 

// Declare variables  
var files = []; 
var filteredFiles = []; 
var i = 0; 
var fileextension = '.html'; 
var foldername = 'node_modules'; 
var filter = { 
    followLinks: false 
}; 
var walker = walk.walkSync(foldername, filter); 

var temp = []; 

module.exports = { 
    scanDirWithFil: function() { 
     walker.on('file', function(root, stat, next) { 
      files.push(stat.name); 
      if (files[i].indexOf(fileextension) != -1) { 
       filteredFiles.push(stat.name); 
       console.log(files[i]); 
       next(); 
       i++; 
      } 
      else { 
       next(); 
       i++; 
      } 
      console.log('Number of filtered files in array: ' + filteredfiles.length + ", Total number of files in array: " + files.length) 
      return files, filteredFiles; 
     }); 
     temp = files.toString(); 
     return temp; 
    } 
}; 

正如人們所看到的,我試圖返回結果的功能scanDirWithFil,但是回報是通過溫度,這是從files.toString。這就是問題所在。由於範圍問題,文件現在變成空數組。從walker.on方法返回的文件數組實際上並沒有超出其本身的範圍..

如果我在我說的是正確的(這是一個範圍問題)..可能有人指導我或幫助我解決這個問題的可能解決方案?

謝謝你,布萊恩

回答

0

望着文檔,顯然調用walker.on導致代碼以異步運行。所以這不是一個示波器問題,而是在執行walker函數之前簡單地執行temp = files.toString()行。因此它唯一的邏輯就是files數組是空的。

爲了在同步方式使用walker你需要做的:

walker = walk.walkSync("/tmp", { 
    listeners: { 
     file: function (root, fileStats, next) { 

     } 
    } 
}); 

參見:https://github.com/coolaj86/node-walk

+0

非常感謝您!所以這是因爲代碼是異步運行的。很高興知道。 –