JavaScript运行机制

一、单线程
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:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值