zoukankan      html  css  js  c++  java
  • 宏任务与微任务


    前言
    JavaScript是个单线程语言,所以就是说在执行一行代码的过程中,必然不会存在同时执行的另一行代码的情况。
    但如果大量的代码都是同步执行的话,程序将进入假死状态等待前面代码执行完毕,这显然不够友好。
    所以为了这种应对这种情况,有了异步的概念, JavaScript的处理很像一个分配任务的管理者,单收到一个异步任务或者请求时候,JavaScript引擎将任务放入一个任务队列中,JavaScript只做一个标识,用来接收成果或者分配任务。

    如网络请求就是一个天生的异步,此时程序告诉你的是,你可以去处理其他事情,而不是愣愣的等待。

    一、宏任务与微任务的执行顺序
      这可以抽象起来理解,举个例子,一个很简单的柜台原理,银行柜员接待客户,接待一个客户就是一个宏任务,这个客户,有可能办理信用卡业务,
    或者存款,取款,这些可以理解为微任务,当这个客户(宏任务)里面的所有业务(微任务)都办理完成后。才会进行下一个宏任务。

    执行片段如下:

     当前宏任务->当前宏任务中的所有微任务->下一个宏任务 

    二、宏任务与微任务有什么

    宏任务:
    setTimeout,setInterval,setImmediate

    补充:其中node支持setImmediate,而在浏览器上不建议(或不支持)使用,在MDN文档(https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate)中也有提到,非标准功能。

    process.nextTick, MutationObserver, Promise

    三、例子

    如:

     1 new Promise((resolve, reject) => {
     2     setTimeout(()=> { // 宏任务
     3         console.log(1);
     4     })
     5     resolve(2);
     6 }).then(res => {
     7     console.log(res);
     8     return 3
     9 }).then(ress => {
    10     console.log(ress)
    11 })
    12 
    13 
    14 // 输出
    15 2
    16 3
    17 1

    由于settimeout属于宏任务,插入宏任务队列中,等待当前所有微任务执行完,才会继续执行。故而输出 2->3->1

    以梦为马
  • 相关阅读:
    Java Comparator和Comparabler的区别
    正则表达式全部符号解释
    Java使用reids,以及redis与shiro集成
    jQuery的select相关操作
    javascrit原生实现jquery的append()函数
    spring拦截器 实现应用之性能监控
    Gitlab完美安装【CentOS6.5安装gitlab-6.9.2】
    关于datepicker只显示年、月、日的设置
    spring aop 环绕通知around和其他通知的区别
    springMVC和spring各自扫描自己的注解不要相互混淆
  • 原文地址:https://www.cnblogs.com/lsAxy/p/14091440.html
Copyright © 2011-2022 走看看