首页 > 编程语言 >javascript 执行机制(同步、异步、微任务、宏任务)

javascript 执行机制(同步、异步、微任务、宏任务)

时间:2022-08-18 11:00:36浏览次数:43  
标签:异步 同步 console log javascript 任务 Promise

一、关于javascript
JS是一门单线程语言,这意味着所有的任务都需要排队,前一个任务结束才会执行后一个任务如果前一个任务耗时很长,后一个任务就不得不一直等着。
这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

 

二、同步任务和异步任务
单线程导致的问题就是后面的任务等待前面任务完成,如果前面任务很耗时(比如读取网络数据),后面任务不得不一直等待。
为了解决这个问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JS 脚本实现“多个线程”(JS是单线程这一核心仍未改变。所以一切"多线程"都是用单线程模拟出来的),但是子线程完全受主线程控制。于是,JS 中出现了同步任务和异步任务。

1.同步任务
同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
比如有五个顾客来到了你的饭店,同步的做法是:先给第一个顾客点菜,然后做菜,结束后再给第二个人…以此类推。

2.异步任务
异步任务:不进入主线程、而进入”任务队列”的任务,当主线程中的任务运行完了,才会从”任务队列”取出异步任务放入主线程执行。
比如有五个顾客来到了你的饭店,异步的做法是:先给每一个顾客点菜,点完之后给他们一个牌子并把对应的菜单放到后厨然后让他们等待,之后后厨根据他们的菜单开始做菜。

 

三、微任务和宏任务
异步任务又分为微任务和宏任务。

1.微任务
包括Promise,process.nextTick

Promise(async/await) => Promise并不是完全的同步,在promise中是同步任务,执行resolve或者reject回调的时候,此时是异步操作,会先将then/catch等放到微任务队列。当主栈完成后,才会再去调用resolve/reject方法执行

process.nextTick (node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找)

MutationObserver (创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。)

2.宏任务
包括整体代码script,setTimeout,setInterval

定时器

事件绑定

ajax

回调函数

Node中fs可以进行异步的I/O操作

 

四、执行顺序
执行顺序总结:先做同步任务,在做异步任务,异步任务又分为微任务和宏任务,先做微任务在做宏任务。
同步任务 => 异步任务( 微任务 => 宏任务 )
需要知道的是JS是单线程的,他的异步编程仅仅是根据某些机制来管控任务的执行顺序,所以并不存在同时执行两个任务这一说法。

 

五、示例

console.log("同步任务1");
​
function workFun(mac) {
    console.log("同步任务2");
    if (mac) {
        console.log(mac);
    }
    return new Promise((resolve, reject) => {
        console.log("Promise中的同步任务");
        resolve("Promise中回调的异步微任务")
    })
}
setTimeout(() => {
    console.log("异步任务中的宏任务");
    setTimeout(() => {
        console.log("定时器中的定时器(宏任务)");
​
    }, 0)
    workFun("定时器传递任务").then(res => {
        console.log('定时器中的:', res);
    })
}, 0)
workFun().then(res => {
    console.log(res);
})
console.log("同步任务3")

/*
** 同步任务1 
同步任务2
Promise中的同步任务
同步任务3
Promise中回调的异步微任务

异步任务中的宏任务
同步任务2
定时器传递任务
Promise中的同步任务
定时器中的: Promise中回调的异步微任务
定时器中的定时器(宏任务)
*/

 

标签:异步,同步,console,log,javascript,任务,Promise
From: https://www.cnblogs.com/lgnblog/p/16597945.html

相关文章

  • 在asp.net中开启后台任务
    开始后台任务一般是Task.Run()查在asp.net时进行可能会被回收,导致Task中断。在Asp,net中有专门的后台任务函数: System.Web.Hosting.HostingEnvironment.QueueBackgroun......
  • 【前端基础】(二)promise异步编排
    ☆promise异步编排javascript众所周知只能支持单线程,因此各种网络请求必须异步发送,导致可能会出现很多问题,比如如下我们有三个文件,现在要求进行如下请求:①查出当前用户......
  • 02.JavaScript学习笔记1
    JavaScript学习笔记1.强制类型转换当使用加号进行运算时,会将数字强制转换为字符串,然后再进行运算。constyear='1991';console.log(year+18);console.log(typeo......
  • JavaScript 性能优化技巧分享
    JavaScript作为当前最为常见的直译式脚本语言,已经广泛应用于Web应用开发中。为了提高Web应用的性能,从JavaScript的性能优化方向入手,会是一个很好的选择。本文从加载......
  • C#异步编程
    一直不是太懂,唉使用Async和Await的任务异步编程(TAP)模型(C#)|MicrosoftDocsC#彻底搞懂async/await-五维思考-博客园(cnblogs.com)C#之Async/Await-......
  • @Async异步方法对异常的处理,从内层向外层抛出机制
    @Async异步方法对异常的处理,从内层向外层抛出机制@RequestMapping(value="/test",method=RequestMethod.GET)publicStringtest(){try{......
  • Vue+Koa+MongoDB从零打造一个任务管理系统
    大概是在18年的时候,当时还没有疫情。当时工作中同时负责多个项目,有PC端运营管理后台的,有移动端M站的,有微信小程序的,每天git分支切到头昏眼花,每个需求提测需要发送邮......
  • Jenkins 定时任务
    每次手动触发job构建,是很麻烦的一件事情,job中可以配置定时构建,今天就来分享下定时构建;构建分为两种:定时构建和轮询SCM。一.定时构建Jenkins采用了著名的UNIX任务调度工......
  • spring boot 定时任务使用
    1.在Springboot启动类上添加注解:@EnableScheduling2.在需要执行定时任务的类上加@Component注解,在需要执行的方法上加@Scheduled(cron="0/2*****")注解@Compon......
  • Python爬虫之多线程异步爬虫,非常详细
    Python爬虫之多线程爬虫在使用Python的过程中,我们可能遇到这样一个场景,需要下载某一个网站上的多个资源;例如:我们想下载豆瓣电影Top250所有的宣传图片具体代码如下......