почему Nodejs callback () не может получить доступ к переменной вне области обратного вызова? - PullRequest
2 голосов
/ 01 февраля 2012

Я довольно новичок в NodeJS и в JavaScript в целом. Вот мой сценарий:

var fs = require('fs') ;

var temp = "???";

var test = function (){
    fs.readdir("./", function(err,result){
    temp = result;            // i change the temp's value
    console.log("inter result ....."+temp);        //  temp's value changed
    setTimeout(pr,1000,"inter setTimeout: "+temp);  //  temp's value changed 
    });
}

var pr = function (str){
    console.log("Print str: "+ str);
} ;


test();

setTimeout(pr,1000,"Out setTimeout print: "+temp);  //  Why here temp's value not change???

Как я могу изменить значение var temp вне обратного вызова?

Ответы [ 2 ]

1 голос
/ 01 февраля 2012
setTimeout(pr,1000,"Out setTimeout print: "+temp);

совпадает с

var str = "Out setTimeout print: " + temp;
setTimeout(pr, 1000, str);

На данный момент temp все еще равно "???".Вы должны использовать

setTimeout(function() {
  pr("Out setTimeout print: "+temp);
}, 1000);
1 голос
/ 01 февраля 2012

В каком порядке отображаются операторы журнала в вашей консоли?

Я не в node.js, но я ожидаю увидеть "Out" перед "inter", потому что я догадываюсьфункция fs.readdir() является асинхронной, и что предоставляемая ей функция обратного вызова не будет выполняться до тех пор, пока вы уже не вызовете setTimeout() в последней строке вашего кода, в которой точка temp еще не былабыл изменен.

То есть последовательность выполнения, которую я ожидаю от вашего кода:

  1. определить fs
  2. определить temp установить в ???
  3. определить test функцию
  4. определить pr функцию
  5. вызов test() функцию
  6. в пределах test() вызов fs.readdir()но затем немедленно возвращаются из test() без выполнения обратного вызова
  7. setTimeout(pr,1000,"Out setTimeout print: "+temp); (где значение temp в тот момент - все еще "???") становится частью строки, которая setTimeoutв одну секунду перейдет к pr)
  8. обратный вызов отfs.readdir() выполняется, и только тогда temp изменяется.Время ожидания "inter" устанавливается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...