欢迎光临散文网 会员登陆 & 注册

宏任务与微任务

2022-10-20 09:44 作者:对白浅浅  | 我要投稿

//  此文件为JS文件  需要在nodejs环境运行


const { rejects } = require("assert")

const { resolve } = require("path")


// js代码是单线程的  在主线程上运行  如果代码是异步的 那么一般会有一个回调函数  不同的异步任务对应不同的回调 比如计时器 Ajax

// 不同的回调会交给不同的模块去处理


// 宏任务

//     分类:setInterval   setTimeout  requestAnimationFrame(用于告诉浏览器在下个动画前调用回调函数)

//     1.宏任务所处的队列就是宏任务队列

//     2.宏任务队列可以有多个

//     3.第一个宏任务队列中只有一个任务:执行主线程的js

//     4.第一个宏任务队列中的所有任务全部执行完成,查看是否有微任务队列,如果有,先执行微任务队列中的所有任务,如果没有,就查看是否有其他宏任务队列


// 微任务

//     分类:new Promise().then(回调)  process.nextTick()

//     1.微任务所处的队列就是微任务队列

//     2.只有一个微任务队列

//     3.在上一个宏任务队列执行完毕后,如果有微任务队列,就会执行微任务队列中的所有任务


console.log('---------start-----------')


setTimeout(function(){

    console.log("setTimeout被执行")

},0)


new Promise((resolve,reject)=>{

    for(var i=0;i<5;i++){

        console.log(i)

    }

    resolve();

}).then(()=>{

    console.log('promise实例成功回调执行')

})


console.log('----------end-----------')


// 输出结果为:

// ---------start-----------

// 0

// 1

// 2

// 3

// 4

// ----------end-----------

// promise实例成功回调执行

// setTimeout被执行


// 原理:


// 第一个宏任务队列                   第二个宏任务                              微任务


// 执行主线程上代码                   setTimeout                            new Promise().then


// 注意:new Promise() 这个过程是同步的  .then()才是异步的


//                                 宏任务                              微任务

// 谁发起的                  宿主(Node,浏览器)                       js引擎

// 具体事件                  scrpit (可以理解为外层同步代码)            Promise.then()

//                         setTimeout/setInterval                    process.nextTick()

//                         UI rendering/ UI事件                      MutaionObserver

//                         postMessage,MessageChannel              

//                         setImmediate

// 谁先运行                         后运行(不考虑主线程)                  先运行

// 会触发新一轮的Tick么              会                                  不会



宏任务与微任务的评论 (共 条)

分享到微博请遵守国家法律