Javascript的同步与异步,宏任务与微任务

JavaScript是单线程:

同一时间只能干一件事情,只有前面的事情执行完,才能执行后面的事情。导致遇到耗时的任务时后面的代码无法执行,这就会影响到执行过程,致使阻塞。

为了解决这个问题,Js将任务分为了同步与异步

同步任务:

普通的代码如console.log()这种就是同步代码,其会在主进程中执行,如果同步代码执行时间长会阻止进程

异步任务:

首当其冲想到的就得是定时器(setTimeout、setInterval)了吧,当然还有Ajax的数据请求、async-await、promise、读写文件等

执行顺序:

同步与异步相遇,优先执行同步任务,所有的同步任务都在主线程上依次执行,形成一个【执行栈】。

执行栈外还有个任务队列:在执行同步任务时也不是对异步置之不理了,异步任务一旦有了运行结果就会在【任务队列】中放置一个事件。当执行栈中的同步任务都执行完了,才会开始读取【任务队列】,看其中有哪些事件,将这些事件放入执行栈开始执行。

怎么执行?

在执行异步任务时,还要明白一个概念就是:宏任务与微任务

宏任务有:script标签,setTimeout,setInterval

微任务有:Promise,nextTick

也就是说在在异步任务里也论资排辈的,会先走微任务,再走宏任务

setTimeout(() => {
   console.log('定时器');
}, 0)
 
new Promise((resolve) => {
   console.log('同步代码')  
   resolve('异步代码')
}).then((res) => {
   console.log(res);   
})
 
console.log('abc');

输出:同步代码、abc、异步代码、定时器

首先最底下的输出是同步无疑,但为啥先输出“同步代码”,不是说promise是异步吗?

promise确实是异步,但new Promise是创建一个构造函数,这个过程是同步的

promise的异步是在说它的回调函数上:.then()    .catch()

所以new Promise下的第一层的输出是同步,和最下面的输出同一级别,按照从上到下顺序,所以先执行。

这个时候注意了,就剩下了定时器和Promise的回调函数.then(),那这俩怎么看顺序呢?

就要用到微任务与宏任务的对比了

Promise的回调是微任务,setTimeout的回调是宏任务,所以先执行Promise的代码

最后总结下来就是:同步优先与异步(异步中又分:微任务优先于宏任务)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值