为什么Nodejs的callback()不能访问外部callback范围的variables?
我对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???
我怎样才能改变callback以外的var temp的值?
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);
日志语句在控制台中显示的顺序是什么?
我没有进入node.js,但我希望在“inter”之前看到“Out”,因为我猜fs.readdir()
函数是asynchronous的,并且你提供给它的callback函数将会直到你的代码的最后一行已经调用了setTimeout()
之后, temp
才会被执行。
也就是说,我期望从你的代码执行的顺序是:
- 定义
fs
- 定义
temp
设置为???
- 定义
test
function - 定义
pr
函数 - 调用
test()
函数 - 在
test()
调用fs.readdir()
,然后立即从test()
返回而没有执行callback -
setTimeout(pr,1000,"Out setTimeout print: "+temp);
(在那一刻temp
的值仍然是“???”)成为setTimeout在一秒钟内传递给pr
的string的一部分) -
fs.readdir()
的callback被执行,只有这样temp
才会被修改。 “内部”超时设置。
- 'session'是未定义的 – Este JS / Express / Redis会话存储
- 在服务器端使用Passport-jwt呈现Express / React应用程序
- 如何开启Firebase Javascript客户端中的日志logging?
- 咕嘟声错误 – 错误:找不到模块'sigmund'
- nock.js – 如何匹配URL中的任何参数组合
- node.js需要inheritance吗?
- Node.jsasynchronous的瀑布()callback已被调用
- 在React.js,node.js,webpack,babel,express中使用fs模块
- Sailsjs的websockets文档去了哪里?