nodejs中的异步回调机制
1.再次clear Timer定时器的作用
setTimeOut绝非是传统意义上的“sleep”功能,它做不到让主线程“熄火”指定时间,它是用来指定:某个回调在固定时间后插入执行栈!(实际执行时间略长于这个固定时间)
2.js或nodejs想"sleep"主线程怎么做?
可以自定义sleep休眠函数,原理就是 目标时间 >= 当前时间+sleepTime; 然后不断在while中tick时间、比较。直接看代码吧。
function sleep(numbermsec){ let now = new Date().getTime(); let desc = now+numbermsec; while( now<desc ){ now = new Date().getTime(); } }
3.js/nodejs的回调到底什么时候执行?可以回调了就执行还是等主线程执行完才执行?做个实验验证一下。
const fs = require('fs'); //异步读文件 fs.readFile( __dirname+'/15_fs.js','utf8',(err,data) =>{ if( err ){ console.log( 'whoops!' ); throw err; }else{ console.log( 'success!' ); } } ); //异步执行setTimeout setTimeout(() => { console.log( 'settimeout!' ); }, 1000); console.log( 'time1:'+new Date().getTime() ); //主程序sleep休眠 function sleep(numbermsec){ let now = new Date().getTime(); let desc = now+numbermsec; while( now<desc ){ now = new Date().getTime(); } } sleep(3000); //主程序执行同步读文件操作 let buf = fs.readFileSync(__dirname+'/15_fs.js','utf8'); console.log( buf ); console.log( 'time2:'+new Date().getTime() );
打印结果:
打印结果分为5部分,从上到下5种颜色,分别标记为1,2,3,4,5:
1.打印主程序的第一个时间戳:time1
2.主程序的同步读文件操作并打印
3.打印主程序的第二个时间戳,time2,很清晰的看到2、3的执行时间比1晚了大约3000ms
4.执行异步的setTimeout回调函数
5.执行异步读文件的回调函数
综上分析可知:
js/nodejs的异步操作是在“整个主程序”都解析执行完毕之后,才执行!
——学无止境,保持好奇。May stars guide your way.
路漫漫其修远兮,吾将上下而求索。
May stars guide your way⭐⭐⭐