-
javascript是一门单线程语言,同时只能做一件事
-
单线程执行任务队列的问题:
- 如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题
-
同步任务和异步任务:
- 为了防止某个耗时任务导致程序假死,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-
每一个宏任务执行完之后,都会检查是否存在待执行的微任务,如果有,则执行完所有的微任务之后,再继续执行下一个宏任务