zoukankan      html  css  js  c++  java
  • 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⭐⭐⭐
  • 相关阅读:
    Delphi 窗体失踪在最上面的代码
    Delphi 目前使用delay函数功能
    Delphi Delay 延时计数的功能。 下面的方法都是思路,但是没有用在项目上
    Delphi 通过SQLite3, SQLiteTable3 操作数据库
    解决sqlite删除数据后,文件大小不变问题 转载
    delphi执行cmd命令和bat文件
    Delphi 获取sqlite中所有的表名
    delphi 获取USB口拔出和插入的状态
    深度揭密轮播插件核心代码的实现过程
    flowJS源码个人分析
  • 原文地址:https://www.cnblogs.com/surfer/p/10292456.html
Copyright © 2011-2022 走看看