javascript的异步编程笔记

134 阅读1分钟

javascript的线程

javascript是一种单线程语言,它的同步执行都是处于一个队列之中,若要实现异步任务,javascript的事件循环机制解决了js的异步问题。 同步任务放入主栈,当主栈为空从任务队列中取出异步任务

异步任务不会马上放入异步队列中,js有个异步处理模块等待异步函数达到触发条件后才放入任务队列(比如setTimeOut到时)

  • 事件循环机制

image.png 异步任务划分为微任务和宏任务,微任务优先级大于宏任务。微任务队列只有一个,宏任务队列可以有多个 优先级:主线程(宏任务)=>微任务=>宏任务

Promise

异步编程一种解决方案,解决了回调地狱,避免层层嵌套回调函数

promise三种状态:

  1. pending(进行)
  2. fulfilled(成功)
  3. 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)
}