Nodejs功能范围
问题描述:
有人可以帮我理解为什么以下不起作用吗?我试图围绕javascript和nodejs来包装我的头。我只是想让函数返回散列。我可能不正确地理解函数范围。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());
我得到的结果是未定义的。
答
你的函数不返回任何东西 - 因此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);
});