当前位置:首页 > javascript > 正文内容

js 宏任务和微任务

tigon5年前 (2020-07-27)javascript3276

首先讲粗略说一下宏任务和微任务
宏任务:script(整体代码), setTimeout, setInterval
微任务包括: Promise, MutationObserver(html5新特性),process.nextTick。

代码从上至下在执行过程,遇到Promise,new Promise直接执行,执行一个宏任务,过程中遇到微任务时,将其放到微任务的事件队列里,当前宏任务执行完成后,会查看微任务的事件队列,依次执行里面的微任务。如果还有宏任务的话,再重新开启宏任务……这个循环过程就是event Loop
网上找的一张图很好解释

看如下这个代码案例

console.log('a');

setTimeout(function() {
    console.log('b');
    process.nextTick(function() {
        console.log('c');
    })
    new Promise(function(resolve) {
        console.log('d');
        resolve();
    }).then(function() {
        console.log('e')
    })
})
process.nextTick(function() {
    console.log('f');
})
new Promise(function(resolve) {
    console.log('g');
    resolve();
}).then(function() {
    console.log('h')
})

setTimeout(function() {
    console.log('i');
    process.nextTick(function() {
        console.log('j');
    })
    new Promise(function(resolve) {
        console.log('k');
        resolve();
    }).then(function() {
        console.log('l')
    })
})
//a、g、f、h、b、d、c、e、i、k、j、l

个人理解来根据案例画了个图

注:可能有些人有各别几个不同,有的在node环境下执行出来的是有区别的,这个可能是在v8引擎和其它下面对于new promise的优先级是不同的吧

版权声明:本文由Web学习之路发布,如需转载请注明出处。

本文链接:https://webge.net/?id=87

返回列表

上一篇:防抖和节流

下一篇:js原型链

“js 宏任务和微任务” 的相关文章

this各种指向

1,由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的。2,只要函数被赋给另一个变量,this的指向就会变。var A = {       name: ...

js类型转换

js类型转换

数据类型: 原始类型:        Boolean Null Undefined Number String Symbol     显示类型转换: ...

函数参数会生成新的作用域

函数参数会生成新的作用域

如果函数定义了参数就会自动生成新的作用域,这时候里面的变量值就会先从参数新的作用域找,如果没有就会再往上面找直到全局...

event-loop

event-loop

如果知道js运行机制,在工作中会帮助我们更好的理解和编写代码,也知道为什么js是单线程js为什么是单线程原因,就是为了避免DOM渲染的冲突异步是一种“无奈”的解决方案,虽然有很多问题,如下:1,没按照书写方式执行,可读性差2,callback中不容易模块化什么是event-loop1,同步代码,直接...

最全的js运行机制

最全的js运行机制

主线程Event Queue:(微任务,宏任务) 1,主线程执行完后2,到Event Queue里找,先执行微任务,再宏任务...