JS:promise-任务队列和事件循环
事件循环是什么
首先,JavaScript是一门单线程的语言,这并不意味着单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环
在JavaScript中,所有的任务都可以分为
- 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
- 异步任务:异步执行的任务,比如ajax网络请求,setTimeout定时函数等
(1)同步任务
function fn(){} var a=new Array() var b=fn()
(2)异步任务
setTimeout(fn,1000)
p1.then(fn)
console.log(123)
实例:
console.log(4) setTimeout(() => { setTimeout(() => { console.log(6) }, 0) console.log(1) var p2 = new Promise((n1, n2) => { n1(1000) }) p2.then(() => { console.log(7) }) }, 0) setTimeout(() => { setTimeout(() => { console.log(2) }, 200) var p3 = new Promise((n1, n2) => { n1(1000) }) p3.then(() => { console.log(8) }) console.log(2) }, 0) var p1 = new Promise((n1, n2) => { n1(1000) }) p1.then(() => { console.log(3) }) console.log(5)
打印:
4 5 3 1 7 2 8 6 2
解析:
先打印同步任务-->4 5,且将宏任务加入队列中等待,then是一个微任务,执行异步微任务,打印-->3,后第一个宏任务执行打印-->1,执行第一个宏任务中的微任务,打印-->7,此时又进入第二个排队的宏任务,执行并打印-->2,依次执行第二个宏任务中的微任务then,打印-->8,最后进入第一个宏任务中嵌套的第一个宏任务,执行并打印-->6,进入第二个宏任务中嵌套的第一个宏任务,执行并打印-->2。
(3)异步任务的队列优先级
异步宏任务先执行 然后在执行异步微任务
(4)开启任务
脚本运行 执行第一个宏任务(脚本就是一个宏任务):
1. 先执行同步任务
2.添加新的宏任务到队列中 添加新的的异步微任务
3.执行异步微任务