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

    以梦为马
  • 相关阅读:
    获取一个表的,字段,类型,长度,是否主键,是否为空,注释 等信息
    单个页面Request编码方式的改变,无需改动Web.config~
    关于锚点页内链接跳转出现问题(不响应,没有反应)的解决方法(ZT)
    40种网站设计常用技巧~
    在MasterPage中检验session是否存在~
    如何避免重构带来的危险
    早该知道的7个JavaScript技巧
    30个提高Web程序执行效率的好经验
    我学编程时犯的最大两个错误
    C# 中get和set属性的作用
  • 原文地址:https://www.cnblogs.com/lsAxy/p/14091440.html
Copyright © 2011-2022 走看看