javascript的线程
javascript是一种单线程语言,它的同步执行都是处于一个队列之中,若要实现异步任务,javascript的事件循环机制解决了js的异步问题。 同步任务放入主栈,当主栈为空从任务队列中取出异步任务
异步任务不会马上放入异步队列中,js有个异步处理模块等待异步函数达到触发条件后才放入任务队列(比如setTimeOut到时)
- 事件循环机制
异步任务划分为微任务和宏任务,微任务优先级大于宏任务。微任务队列只有一个,宏任务队列可以有多个
优先级:主线程(宏任务)=>微任务=>宏任务
Promise
异步编程一种解决方案,解决了回调地狱,避免层层嵌套回调函数
promise三种状态:
- pending(进行)
- fulfilled(成功)
- rejected(失败) promise函数是同步任务,.then才是异步微任务
new Promise((resolve,reject)=>{
// doSomething
}).then()
成功回调resolve()进入then
async/await
async函数返回promise对象,遇到await先执行await右侧表达式,再让出线程执行async外部的同步任务。await返回封装promise对象,如果本身就是promise对象就不再次封装
await()只能在async方法内执行
async内部的异步函数如果加了await,那么就会以同步方法是进行
// 定义接口请求
function request(num){
return new Promise((res)=>{
setTimeOut(()=>{
resolve(num * 2)
},1000)
})
}
// req2就能以req1为参数向接口请求
// request虽然是异步函数,但是在f1内部是同步进行的
async function f1(){
const req1 = await request(1)
const req2 = await request(req1)
}