js运行机制之微任务和宏任务

2019-03-04  本文已影响0人  一包

https://segmentfault.com/a/1190000013660033?utm_source=channel-hottest
感觉有点问题,有空研究一下
大家忽略我这个文章叭!!!!

参考原文,写得特别好,小可爱可以看看,浅显易懂

之前了解过js的运行机制,知道有异步和同步,eventloop的存在,但最近复习的时候发现怎么又来了个微任务和宏任务?????

所以整理一下小笔记,我们一起看看是什么东西吧!

js同步异步

js异步运行机制

异步执行的运行机制如下(同步任务也如此,因为它可以被视为没有异步任务的异步执行):

  1. 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)
  2. 主线程之外,还存在一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”之中放置一个事件
    3.一旦“执行栈”中的所有同步任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待,进入执行栈,开始执行
  3. 主线程不断重复第3步
    [图片上传失败...(image-77d9ff-1551700016485)]

微任务和宏任务

不同类型的任务会进入不同的Event Queue,有宏任务的队列和微任务的队列。

事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。

setTimeout(function() {
    console.log('setTimeout');
})

new Promise(function(resolve) {
    console.log('promise');
}).then(function() {
    console.log('then');
})

console.log('console');

分析代码

console.log('1');

setTimeout(function() {
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})
process.nextTick(function() {
    console.log('6');
})
new Promise(function(resolve) {
    console.log('7');
    resolve();
}).then(function() {
    console.log('8')
})

setTimeout(function() {
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
})

答案
1 7 6 8 、2 4 3 5、 9 11 10 12

上一篇 下一篇

猜你喜欢

热点阅读