nodejs中的异步回调机制

Posted sophel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.

 

以上是关于nodejs中的异步回调机制的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs异步的执行过程

Nodejs 回调机制——哪个线程处理回调?

[NodeJS]Node异步编程基础

如何优雅的处理Nodejs中的异步回调

如何优雅的处理Nodejs中的异步回调

理解js异步编程