0

我需要一些帮助来理解如何从我想作为 module.exports 传递的函数中复制结果。这里存在全局和本地范围的问题:

// 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 的结果,但是返回是通过 temp,它来自 files.toString。这就是问题所在。由于范围问题,文件现在变成了一个空数组。从 walker.on 方法返回的文件数组实际上并没有超出其自身范围。

如果我说的话是正确的(这是一个范围问题)..有人可以指导我或帮助我解决这个问题吗?

谢谢你,布赖恩

4

1 回答 1

0

查看文档,显然调用walker.on会导致代码异步运行。所以这不是范围问题,而是temp = files.toString()在 walker 函数执行之前简单地执行了该行。files因此,数组为空是唯一合乎逻辑的。

为了walker在同步模式下使用,您需要执行以下操作:

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

        }
    }
});

见:https ://github.com/coolaj86/node-walk

于 2013-11-01T02:24:30.617 回答