我对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的值?
答案 0 :(得分:1)
日志语句在控制台中的显示顺序是什么?
我没有进入node.js,但是我希望在“inter”之前看到“Out”,因为我猜测fs.readdir()
函数是异步的,并且你提供的回调函数只有在您已经在代码的最后一行调用setTimeout()
之后才会执行此操作,此时temp
尚未更改。
也就是说,我希望你的代码执行的顺序是:
fs
temp
设置为???
test
功能pr
功能test()
功能test()
内调用fs.readdir()
但后来立即从test()
返回,但尚未执行回调setTimeout(pr,1000,"Out setTimeout print: "+temp);
(此时temp
的值 - 仍为“???” - 成为setTimeout在一秒钟内传递给pr
的字符串的一部分)< / LI>
fs.readdir()
的回调,只有temp
才会被更改。 “inter”超时设置。答案 1 :(得分:1)
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);