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⭐⭐⭐
  • 相关阅读:
    构造函数的继承
    创建一个不被销毁的空间 闭包小应用
    如何在Linux上恢复误删除的文件或目录
    一文详解 Ansible 自动化运维
    Shell 脚本编程最佳实践
    10 分钟看懂 Docker 和 K8S!
    BGP路由协议详解(完整版)
    浅析 Linux 中的零拷贝技术
    2020年DevOps工程师入门指南
    一条更新的SQL如何执行
  • 原文地址:https://www.cnblogs.com/surfer/p/10292456.html
Copyright © 2011-2022 走看看