Nodejs的功能范围

时间:2015-02-09 22:26:00

标签: node.js

有人可以帮我理解为什么以下不起作用?我试图围绕javascript和nodejs。我只想让函数返回哈希值。我可能无法正确理解功能范围。

function generateHash() {

    var hash = '';

    var toHash = function(stdout){
        hash = new Buffer(stdout).toString('base64');
        //console.log(hash);
        return hash;
    };

    exec("date +%Y-%m-%d", function(err, stdout, stderr){
        var todaysDate = stdout.trim();
        toHash(todaysDate);
    });

};

console.log(generateHash());

我得到的结果是未定义的。

1 个答案:

答案 0 :(得分:2)

您的功能不会返回任何内容 - 因此undefined

在节点中有关于asynchronous execution的约定 - 函数应该接受回调作为它们的最后一个参数,并且这个回调是作为参数传递错误和结果。你可以在你的例子中看到它:

exec("date +%Y-%m-%d", function(err, stdout, stderr){
        var todaysDate = stdout.trim();
        toHash(todaysDate);
    });

exec并未返回任何内容 - 而是接受上述回调。当操作完成并且被给出错误或所有其他参数时,将调用此回调。如果你想调用异步功能,你也必须是异步的!所以你应该将你的generateHash函数更改为异步。

您还可以发现,您回调exec并不会返回它只是调用toHash的任何内容 - 死角通常是代码问题的症状。

您的异步代码可能如下所示:

function generateHash(callback) {
    var toHash = function(stdout){
        return new Buffer(stdout).toString('base64');
    };

    exec("date +%Y-%m-%d", function(err, stdout, stderr){
        var todaysDate = stdout.trim();
        if(err) {
            return callback(err);
        }
        callback(null, toHash(todaysDate));
    });

};

generateHash(function(err, hash) {
    console.log(hash);
});