一、单线程
js是单线程,一个任务完成之后才能执行另一个任务。
二、同步与异步:
1、计时器(setTimeout,setInterval)
2、ajax
3、读取文件
同步异步区别:
注:同步程序执行完成后,执行异步程序。
图中上面是同步的,下面是异步的。
三、process.nextTick与setImmediate方法
两个函数的执行顺序如下:
1、同步
2、nextTick
3、异步
4、setImmediate(当前事件循环结束执行)
例子:
setImmediate(()=>{
console.log(1)
})
process.nextTick(() =>{
console.log(2)
})
console.log(3);
setTimeout(() => {console.log(4)},0)
console.log(5);
//输出结果为3、5、2、4、1
事件循环:不断检测任务队列里是否有任务,有多个任务的话就按顺序执行。
运行栈内存放的是同步事件,任务队列存放的是异步事件。
为什么有时候计时器会不准?
原因:定时器只会到一定的时间点后将其任务插到任务队列里,并不一定到点后立即执行。要将运行栈和任务队列中其他优先级高的任务执行完之后才会执行最后那个任务。
四、宏任务和微任务
微任务:promise.then
宏任务:计时器,ajax,读取文件
执行顺序:
1、同步程序
2、process.nextTick
3、微任务(异步)
4、宏任务(异步)
5、setImmediate
例子:
五、promise和async函数
1、promise函数
let p = new promise((reslove) => {
reslove("hello")
})
p.then((data) => {
console.log(data)
})
//get返回值为一个promise对象p,axios会把获取的一个远程数据通过reslove传出来,然后才能
//调用then将其拿出来。
axios.get("").then((res) =>{
console.log(res);
})
2、async函数
async函数的返回值是promise对象
async function fun(){
return 1
}
let a = fun();
console.log(a)//Promise{1}
这样写才会打印的是1。
//用async函数写方法fun
async function fun(){
return 1
}
//用promise函数写方法fun
function fun(){
return new Promise((resolve) =>{
resolve(1);
})
}
//可见async写法更加简洁(可以理解为async函数是promise对象的简写)
fun().then((data) =>{
console.log(data);//1
})
如何搭配await使用:
let p1 = new Promise((reslove) => {
resolve(1)
})
let p2 = new Promise((reslove) => {
resolve(2)
})
async function fun (){
let a = await p1;
let b = await p2;
console.log(a);
console.log(b);
}
fun();
例子1:
async function fun1(){
let data = await fun2();
console.log(data);//其实我们可以将await之后的代码当作是then执行的代码
}
async function fun2(){
console.log(200);//同步
return 100
}
fun1();//代码执行结果200 100
例子2: