• js中宏任务和微任务


    宏任务包括<script>整体代码、setTimeoutsetIntervalsetImmediateAjax、DOM事件
    微任务process.nextTickMutationObserverPromise.then catch finally

    JS是单线程,碰见同步执行同步 直到执行完毕,遇到异步放到执行队列中去,异步(宏任务和微任务),在异步中微任务是优于宏任务执行的

     1 setTimeout(_ => console.log(4))
     2 
     3 new Promise(resolve => {
     4   resolve()
     5   console.log(1)
     6 }).then(_ => {
     7   console.log(3)
     8 })
     9 
    10 console.log(2)

    整个这一串代码我们所在的层级我们看做一个任务,其中我们先执行同步代码。第一行的 setTimeout 是异步代码,跳过,来到了 new Promise(…) 这一段代码。前面提到过,这种方式是一个构造函数,是一个同步代码,所以执行同步代码里面的函数,即 console.log(1),接下来是一个 then 的异步,跳过。最后一个是一段同步代码 console.log(2)。所以,这一轮中我们知道打印了1, 2两个值。接下来进入下一步,即之前我们跳过的异步的代码。从上往下,第一个是 setTimeout,还有一个是 Promise.then()。setTimeout 是宏任务的异步,Promise.then()是微任务的异步,微任务是优先于宏任务执行的,所以,此时会先跳过 setTimeout 任务,执行两个 Promise.then() 的微任务。所以此时会执行 console.log(3) 函数。最后就只剩下 setTimeout 函数没有执行,所以最后执行 console.log(4)。

    综上:最后的执行结果是 1, 2, 3,  4。

    解释下:

    setTimeout就是作为宏任务来存在的,而Promise.then则是具有代表性的微任务

    参考:https://www.jb51.net/article/223869.htm

  • 相关阅读:
    【Head First Servlets and JSP】笔记
    【Java Web】新手教程(转)
    【Java Web】入门资源整理
    【离散数学】网络资源整理
    【c++习题】【17/5/8】重载运算符
    【c++习题】【17/4/13】stack
    【笔记】css3实现网页平滑过渡效果...
    【Python】常用内建模块(卒)
    【Java】仿真qq尝试:用户注册(三)
    【Thinking in java, 4e】复用类
  • 原文地址:https://www.cnblogs.com/shun1015/p/15671519.html
Copyright © 2020-2023  润新知