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!‘ ); }} );//异步执行setTimeoutsetTimeout(() => { 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.

 

相关文章