有人可以帮我理解为什么以下不起作用?我试图围绕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());
我得到的结果是未定义的。
答案 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);
});