js 同步任务,异步任务,宏任务,微任务

js执行任务是单线程的,代码从上往下按顺序执行, 这就造成了如果前面任务很慢,那后面的任务就永远执行不了,为了解决这个问题,js中出现了同步任务和异步任务。

异步任务又分为宏任务和微任务
1. 宏任务
a. 定时器
b. 事件绑定
c. ajax
d. 回调函数
e. Node中fs可以进行异步的I/O操作
2.微任务
a. Promise(async/await)
promise 并不是完全的同步,在promise中是同步任务,执行resolve或者reject回调的时候,此时是异步操作,会先将then/catch等放到微任务队列。当主栈完成后,才会再去调用resolve/reject方法执行。
async/await是Promise的升级,紧跟await的相当于promise里面的,而后面的语句则相当于then中的语句,会在后面执行。
b. process.nextTick (node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找)
c. MutationObserver (创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。)

执行顺序是:同步任务=》微任务 =》宏任务

下面看两个例子理解下:

console.log('同步任务1');
setTimeout(() => {
  console.log('setTimeout中的异步任务')
}, 0);
new Promise((resolve) => {
  console.log('promise中的同步任务');
  resolve()
}).then(() => {
    console.log('promise中的异步任务1');
  }).then(() => {
    console.log('promise中的异步任务2');
  });
console.log('同步任务2');

执行结果:
在这里插入图片描述

async function async1() {
  console.log("async1中的同步任务");
  await async2();
  console.log("async1中的异步任务");
}
async function async2() {
  console.log("async2中的同步任务");
}
async1();
setTimeout(() => {
  console.log("setTimeOut中的异步任务");
}, 0);
new Promise(function (resolve) {
  console.log("promise中的同步任务");
  resolve();
}).then(function () {
  console.log("promise中的异步任务");
});
console.log("同步任务");

执行结果:
在这里插入图片描述
顺带说下,两端代码执行中都有个undefined, 开始我以为是调试器在微任务和宏任务之间打印了个undefined,后来查了资料发现不是这样,是调试器返回给我们的语句返回值,如果没有值就返回undefined,如果有多个语句就返回最后一个语句的返回值。所以上面的undefined是最后一句console语句的返回值。

如果我们调换setTimeOut的顺序就会发现返回值不一样了:
在这里插入图片描述在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值