什么是同异步

同步

因为JavaScript的单线程,因此同个时间只能处理同个任务,所有任务都需要排队,前一个任务执行完,才能继续执行下一个任务。比如网页渲染就是一个同步任务

异步

异步任务是指不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程,当我们打开网站时,像图片的加载,音乐的加载,其实就是一个异步任务

Async/await:是一个用同步思维解决异步问题的方案

async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。

await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。

await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;

如果不是Promise对象:把这个非promise的东西当做await表达式的结果。

 我之前在学习的时候一直以为await是让其他先执行 await后面跟的函数再执行导致我的理解十分错误,后来自己代码过程中才改变自己的这个认知,真实菜鸡了。。

上代码

// 使用async/await获取成功的结果
// 定义一个异步函数,3秒后才能获取到值(类似操作数据库)
function getSomeThing(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve('获取成功')
        },3000)
    })
}
 
 function test(){
    let a = getSomeThing();
    console.log(a)
}
test();

这样的输出是直接一个promise,不会在3秒后出现获取成功  因为打印a和执行getSomeThing()函数是一起的 还没到获取的a时候就已经打印了a。所以会无法输出。

但是这样写就会在3秒后出现获取成功

// 使用async/await获取成功的结果
// 定义一个异步函数,3秒后才能获取到值(类似操作数据库)
function getSomeThing(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve('获取成功')
        },3000)
    })
}
 
async function test(){
    let a = await getSomeThing();
    console.log(a)
}
test(); // 3秒后输出:获取成功

await的意思在我看来就是 后面的你先等等 我出结果了你再运行。

实际项目代码

async mounted() {
    const res = await GETList()
    console.log(res, 'see')
    if (res.list.length) {
      this.getAllData()
    }
  },

如果没有await,length就会报错无法获取。等第一个请求发送获取到了res.list后再执行if判断length长度 获取其他数据。

适用于执行函数多个,需要上一个函数执行获取再传递给下一个函数运行。同步思想使用异步

Logo

鸿蒙生态一站式服务平台。

更多推荐