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.

 

posted @   sophel  阅读(1807)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· Tinyfox 发生重大改版
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· 小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5
· 近期最值得关注的AI技术报告与Agent综述!
点击右上角即可分享
微信分享提示