2015-02-09 223 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); 
});