!执行顺序
先同步后异步
同步->process.nextTick->微任务(promise.then)->宏任务(计时器,ajax,读取文件)->setImmediate->后续的事件循环
基本概念
同步:按照顺序执行
异步:先执行一部分 等拿到结果再执行后续的代码
process.nextTick:同步之后,异步之前
setImmediate:当前事件循环结束
异步分:宏任务与微任务
微任务:promise.then
宏任务:计时器、ajax、读取文件(主要是计时器)
async函数
单线程:js是单线程的;一个任务完成之后才能执行另外一个任务
事件循环:处理异步的程序,它会在任务队列中取出任务去执行,它会先处理微任务 在处理宏任务,知道任务队列的事件被执行完(思考:计时器不准是因为只是到点了插到任务队列里,等待同步代码执行完了,再事件循环)
同步代码:放到运行栈里面执行
异步代码:是到点了插入任务队列,等待事件循环
简单测试
// 2,5,6,8,7,3,1,4
setImmediate(()=>{
console.log(1);
})
console.log(2)
setTimeout(()=>{
console.log(3);
},0)
setTimeout(()=>{
console.log(4);
},100)
console.log(5)
new Promise((resolve)=>{
console.log(6); // resolve前是同步的
resolve();
}).then(()=>{
console.log(7);
})
process.nextTick(()=>{
console.log(8);
})
如果对Promise和async还不是很熟悉,可以往下
// Promise
let p = new Promise((resolve) => {
console.log(1) // 这里还是同步
resolve('数据') // 有resolve才可以then
})
p.then((data) => {
console.log(data) // data就是resolve传出来的值
})
// async
async function func() { // 可以说async函数就是一个‘Promise对象’的简写
return "数据"
}
async function func() { // 展开是这样的
return new Promise((resolve) => {
resolve("数据")
})
}
func().then((data) => {
console.log(data) // data就是"数据"
})
async function func() {
let a = await p1
let b = await p2
console.log(a, b) // 1 2 相当于then中执行的代码(微任务)
}
func()
进阶测试
// 1,3,5,8,2,6,7,4
console.log(1)
async function async1() {
await async2()
console.log(2) // 相当于then,微任务
}
async function async1() {
console.log(3) // 没有retrun也就是没有resolve 这之前,还是同步
}
async1()
setTimeout(() => {
console.log(4)
}, 0)
new Promise(resolve => {
console.log(5) // resolve之前,还是同步
resolve()
}).then(function () {
console.log(6)
}).then(function () {
console.log(7)
})
console.log(8)
!注意
promise在resolve前是同步,不resolve就没有then的data
async也是promise return就是resolve return前是同步 await后是then(微任务)