我认为可变范围有问题

时间:2013-01-26 23:59:13

标签: javascript node.js

我认为我在变量范围方面遇到了麻烦。最后,我正在创建一个包含某些文件的文本日志,并使用以下代码修改其日期:

var fs = require('fs');

fs.writeFileSync('./scan_log.txt', "");

for(e in extensions){
    createScanLogHeader(extensions[e]);

    for (l in lines){
        if(lines[l].indexOf(extensions[e]) > -1){
        var fileMtime = getFileProperty(lines[l], "mtime");
        fs.appendFileSync('./scan_log.txt', fileMtime + " " + lines[l] + "\n");
        }
    }
}

function getFileProperty(path, prop){
    fs.stat(path, function(err, stats){
        return stats.prop;
    });
}

我在文件路径之前加上“undefined”而不是mtime文件属性。但是,如果我在console.log(stats.prop)上面getFileProperty函数中加return stat.prop,我会将正确的信息记录到控制台。

3 个答案:

答案 0 :(得分:0)

您的stat来电是异步的,而您的getFileProperty函数未定义return值,因此会返回undefined

使用statSync并返回其值,或将回调传递给getFileProperty

    for (l in lines){
        if(lines[l].indexOf(extensions[e]) > -1){
            getFileProperty(lines[l], "mtime", function(path, prop) {
                fs.appendFileSync('./scan_log.txt', prop + " " + path + "\n");
            });
        }
    }

function getFileProperty(path, prop, fn){
    fs.stat(path, function(err, stats){
        fn(path, stats[prop])
    });
}

答案 1 :(得分:0)

这不是范围问题,而是来自return stats.prop;回调stat。由于stat是异步的,因此回调的返回值没有意义(如果确实如此,它仍会在以后发生,与调用getFileProperty异步)。

如果您绝对必须让getFileProperty 返回值,那么您必须使用statSyncreturn必须来自getFileProperty,而不是您传递的回调stat

答案 2 :(得分:0)

不熟悉node.js框架,但有点google搜索显示fs.stat(path,function)是异步的;所以基本上当你打电话

var fileMtime = getFileProperty(lines[l], "mtime");

你输入 getFileProperty 立即返回,所以异步返回stats.prop基本上没有了...我你应该是使用 fs.statSync(path) insteaad,这是同步版本。