2015-02-09 4 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); 
}); 
Смежные вопросы