2015-02-09 166 views
0

有人可以帮我理解为什么以下不起作用吗?我试图围绕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()); 

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

回答

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); 
});