zoukankan      html  css  js  c++  java
  • 记了老是忘记那就写下来吧宏任务微任务

    宏任务:script 定时器 微任务:promiss process.nexttick

    new Promise(function(resolve){
      console.log(3);//此为同步程序
      resolve();//同步 是否异步 由内部函数决定
      console.log(4);
    }).then(function(){
    //。then 异步
      console.log(5);
    });
            async function async1() {
                console.log("async1 start");//同步
                await  async2();//同步 是否异步 由内部函数决定
                console.log("async1 end");//异步开始
     
            }
            
    

      process.nextTick 永远大于 promise.then

    知乎练习题

     
    setTimeout(function () {
      console.log(4)
    }, 0);
    new Promise(function (resolve) {
      console.log(1);
      for (var i = 0; i < 10000; i++) {
        i == 9999 && resolve()
      }
      console.log(2)
    }).then(function () {
      console.log(5)
    });
    console.log(3);
    
    // 1 3 2  5 4 错误
    // 12354 ✅
    // 由于整个 script 也属于一个 macrotask, 由于会先执行 macrotask 中的第一个任务,
    再加上promise 构造函数因为是同步的,所以会先打印出 1和2然后继续同步执行末尾的 
    console.log(3) 打印出3 此时 setTimeout 被推进到 macrotask 队列中,
     promise.then 回调被推进到 microtask 队列中由于在第一步中已经执行完了第一个 
    macrotask , 所以接下来会顺序执行所有的 microtask, 也就是 promise.then 的回调函数
    ,从而打印出5microtask 队列中的任务已经执行完毕,继续执行剩下的 macrotask 队列中
    的任务,也就是 setTimeout, 所以打印出 4
    

      

    “剩下的疑问: process.nextTick也会放入microtask quque,为什么优先级比promise.then高呢? 到底是不是setTimeout有一个依赖实现的最小延迟?4ms?”

    process.nextTick 永远大于 promise.then,原因其实很简单。。。在Node中,_tickCallback在每一次执行完TaskQueue中的一个任务后被调用,而这个_tickCallback中实质上干了两件事: 1. nextTickQueue中所有任务执行掉(长度最大1e4,Node版本v6.9.1) 2. 第一步执行完后执行_runMicrotasks函数,执行microtask中的部分(promise.then注册的回调) 所以很明显process.nextTick > promise.then

  • 相关阅读:
    是什么意思
    Hql查询
    java的LINQ :Linq4j简明介绍
    Sqlite内存数据库
    ACE中的Proactor介绍和应用实例
    mysql的锁表问题
    消息:'null'为空或不是对象
    FusionChart中引入图类型和数据源方法
    实现FusionChart动态获取数据(二)
    JSP页面解决文件路径方法
  • 原文地址:https://www.cnblogs.com/smzd/p/8482278.html
Copyright © 2011-2022 走看看