js的eventloop

  • javascript是一门单线程语言,同时只能做一件事

  • 单线程执行任务队列的问题:

    • 如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题
  • 同步任务和异步任务:

    • 为了防止某个耗时任务导致程序假死,javascript把等待的任务分为了两类:
      • 同步任务
        • 又叫非耗时任务,指的是在主线程上排队执行的那些任务
        • 只有前一个任务执行完毕,才能执行后一个任务
      • 异步任务
        • 又叫做耗时任务,异步任务由javascript委托给宿主环境进行

同步任务和异步任务的执行过程:

  • 1.同步任务由javascript主线程次序执行
  • 2.异步任务委托给宿主环境执行
  • 3.以为完成的异步任务对应的回调函数,会被加入到任务队列中等待执行
  • 4.javascript主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行
  • 5.javascript主线程不断重复上面的第4步

EventLoop的基本概念:

javascript主线程从任务队列中读取异步任务的回调函数,放到执行栈中一次执行,这个过程是循环不断的,所以整个的这种运行机制又称为EventLoop(事件循环)

结合EventLoop分析输出的顺序:

import thenfs from 'then-fs'

console.log('A')

thenfs.readFile('./text/1.txt', 'utf8', function (err, doc) {
    
    
	console.log('B')
})

setTimeout(() =>{
    
    
	console.log('C')
}, 0)
console.log('D')
//输出ADCB

A,D不属于异步耗时任务,所以先输出;B,C委托给了宿主环境,但是C中定时为0,所以相当于没有定时,直接执行

宏任务和微任务:

javascript又把异步任务做了进一步的划分:异步任务又分为两类,分别是:

  • 1.宏任务,

    • 异步ajax请求
    • setTimeout,setInterval
    • 文件操作
    • 其他宏任务
  • 2.微任务

    • Promise.then,.catch和.finally
    • process.nextTick
    • 其他微任务
  • 宏任务和微任务的执行顺序:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4451ldPU-在这里插入图片描述

每一个宏任务执行完之后,都会检查是否存在待执行的微任务,如果有,则执行完所有的微任务之后,再继续执行下一个宏任务

猜你喜欢

转载自blog.csdn.net/ice_stone_kai/article/details/124086325