Javascript 在基目录数组中递归查找子目录

Javascript 在基目录数组中递归查找子目录,javascript,recursion,firefox-addon,Javascript,Recursion,Firefox Addon,出于测试目的,我试图记录3个基本目录中包含多少(子)目录,但结果没有意义。 linux控制台输出与插件输出相比,子目录的数量不匹配,例如 console.log: recursive: 7 console.info: recursive: time taken = 38ms console.log: recursive: 7 console.info: recursive: time taken = 41ms console.log: recursive: 35 console.info:

出于测试目的,我试图记录3个基本目录中包含多少(子)目录,但结果没有意义。
linux控制台输出与插件输出相比,子目录的数量不匹配,例如

console.log: recursive: 7
console.info: recursive: time taken =  38ms
console.log: recursive: 7
console.info: recursive: time taken =  41ms
console.log: recursive: 35
console.info: recursive: time taken =  330ms
Total time: 7.571605 seconds
Program terminated successfully.
rob@work:~/git/recursiveDirListingFF$ find /home/rob/Pictures/ -mindepth 1 -type d | wc -l
1
rob@work:~/git/recursiveDirListingFF$ find /home/rob/Music/ -mindepth 1 -type d | wc -l
2
rob@work:~/git/recursiveDirListingFF$ find /home/rob/Downloads/ -mindepth 1 -type d | wc -l
37
有人能看一看,并提出可能的问题吗?
下面是代码,
main.js

var myBaseDirs = [];

myBaseDirs.push('/home/rob/Pictures');
myBaseDirs.push('/home/rob/Music');
myBaseDirs.push('/home/rob/Downloads');

require("./FileIO").list(myBaseDirs);
var {
        Cu
    } = require("chrome"),
    {
        OS
    } = Cu.import("resource://gre/modules/osfile.jsm", {});

function compare(a, b) {
    if (a.filename < b.filename)
        return -1;
    if (a.filename > b.filename)
        return 1;
    return 0;
}

exports.list = function (dirs) {

    var audio = [],
        dirsTemp = [],
        checkedSubdirI = dirs.length - 1,
        sTime = new Date().getTime(),
        eTime = 0;

    for (var w = 0; w < dirs.length; w++) {
        dirsTemp.push(dirs[w]);
    }

    for (var k = 0; k < dirsTemp.length; k++) {

        let iterator = new OS.File.DirectoryIterator(dirsTemp[k]);

        var promise = iterator.forEach(
            function onEntry(entry) {
                if (entry.isDir) {
                    dirsTemp.push(entry);
                }
            }
        );

        var onSuc = function onSuccess() {
            iterator.close();
            if (checkedSubdirI === dirsTemp.length - 1) {
                eTime = new Date().getTime();
                console.log(dirsTemp.length);
                console.info('time taken = ', eTime - sTime + 'ms');
                return dirsTemp;
            } else {
                checkedSubdirI++;
                iterator = new OS.File.DirectoryIterator(dirsTemp[checkedSubdirI].path);
                promise = iterator.forEach(
                    function onEntry(entry) {
                        if (entry.isDir) {
                            dirsTemp.push(entry);
                        }
                    }
                );
                return promise.then(
                    onSuc,
                    onRej
                );
            }
        }

        var onRej = function onFailure(reason) {
                iterator.close();
                eTime = new Date().getTime();
                console.info('FAILED reason = ', reason, 'time taken = ', eTime - sTime + 'ms');
                throw reason;
            }
            // Finally, close the iterator
        promise.then(
            onSuc,
            onRej
        );
    }
};
FileIO.js

var myBaseDirs = [];

myBaseDirs.push('/home/rob/Pictures');
myBaseDirs.push('/home/rob/Music');
myBaseDirs.push('/home/rob/Downloads');

require("./FileIO").list(myBaseDirs);
var {
        Cu
    } = require("chrome"),
    {
        OS
    } = Cu.import("resource://gre/modules/osfile.jsm", {});

function compare(a, b) {
    if (a.filename < b.filename)
        return -1;
    if (a.filename > b.filename)
        return 1;
    return 0;
}

exports.list = function (dirs) {

    var audio = [],
        dirsTemp = [],
        checkedSubdirI = dirs.length - 1,
        sTime = new Date().getTime(),
        eTime = 0;

    for (var w = 0; w < dirs.length; w++) {
        dirsTemp.push(dirs[w]);
    }

    for (var k = 0; k < dirsTemp.length; k++) {

        let iterator = new OS.File.DirectoryIterator(dirsTemp[k]);

        var promise = iterator.forEach(
            function onEntry(entry) {
                if (entry.isDir) {
                    dirsTemp.push(entry);
                }
            }
        );

        var onSuc = function onSuccess() {
            iterator.close();
            if (checkedSubdirI === dirsTemp.length - 1) {
                eTime = new Date().getTime();
                console.log(dirsTemp.length);
                console.info('time taken = ', eTime - sTime + 'ms');
                return dirsTemp;
            } else {
                checkedSubdirI++;
                iterator = new OS.File.DirectoryIterator(dirsTemp[checkedSubdirI].path);
                promise = iterator.forEach(
                    function onEntry(entry) {
                        if (entry.isDir) {
                            dirsTemp.push(entry);
                        }
                    }
                );
                return promise.then(
                    onSuc,
                    onRej
                );
            }
        }

        var onRej = function onFailure(reason) {
                iterator.close();
                eTime = new Date().getTime();
                console.info('FAILED reason = ', reason, 'time taken = ', eTime - sTime + 'ms');
                throw reason;
            }
            // Finally, close the iterator
        promise.then(
            onSuc,
            onRej
        );
    }
};
var{
铜
}=要求(“铬”),
{
操作系统
}=Cu.导入(“resource://gre/modules/osfile.jsm", {});
功能比较(a、b){
if(a.filenameb.filename)
返回1;
返回0;
}
exports.list=函数(dirs){
var audio=[],
dirsTemp=[],
checkedSubdirI=dirs.length-1,
时间=新日期().getTime(),
时间=0;
对于(var w=0;w
这被证明是有用的:

//start-helper函数
函数enumChildEntries(路径到dir、委托、最大深度、runDelegateOnRoot、深度){
//重要提示:作为调用此函数的开发人员,`depth`arg必须始终为null/未定义(甚至不要将其设置为0)。此arg用于内部迭代使用
//“delegate”是必需的
//pathToDir是必需的,它是字符串

//max_depth应设置为null/undefined/有什么问题?请查看控制台输出与加载项输出,子目录的数量不匹配。此处的函数存在缺陷,请参阅MDN文档页面上的更新函数:@Noitidart in a
Firefox
addon我收到此错误,
ReferenceError:Deferred未定义ed
。我应该如何/从何处导入
延迟的