async await

297 阅读2分钟

async await

含义

  • async:异步。放在函数前面表明该函数为异步函数。
  • await:等待一个异步方法执行完成。
  • await只能出现在async函数中。

作用

async作用

image.png

image.png 从上图可知:async函数返回的是一个Promise对象。如果在函数中return一个直接量,async会把这个直接量通过Promise.resolve()封装成Promise对象。 如果没有用await,要想打印出返回值则需要.then()来处理Promise对象。如下:

image.png

在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二致。

await作用

可以认为 await 是在等待一个 async 函数完成。await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,就是没有特殊限定)。所以,await后面实际是可以接普通函数调用或者直接量的。如下:

image.png await表达式的运算结果取决于它等的东西。

如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西。

如果它等到的是一个 Promise 对象,await 就忙起来了,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。

其实这就是 await 必须用在 async 函数中的原因。async 函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。

  • await相当于Promise的then,then指的是成功,不指失败。

  • try...catch可捕获异常,代替了Promise的catch。

  • await 后面接 Promise
    1.await p1相当于是 p1.then,并且只是成功态的then
    2.await 和 then 的区别就是:then还需要传回调进去,但 await 可以直接得到值

    fn().then( data=>{ console.log(data) } )
    
    //await直接通过返回值来接收data, return data 
    const res = await fn()
    

image.png

执行顺序

  • 代码中存在 await,则需要等待该行执行完才执行下面的代码
function timeout(){
  return new Promise(resolve=>{
    setTimeout(()=>{
	  console.log(1)
	  resolve()//成功态
	})
  })
}

//情况一
async function fn(){
  timeout()
  console.log(2)
}
fn() //打印出 2 一秒后 1

//情况2
async function fn(){
  await timeout()
  console.log(2)
}
fn() //1秒后打印出 1 2
//写法二
function timeout(){
  return new Promise(resolve=>{
    setTimeout(()=>{
	  resolve(1)//成功态,传递参数1
	})
  })
}
async function fn(){
  const res = await timeout() //需要一个变量来接收await return的参数
  console.log(res)
  console.log(2)
}
fn() //1秒后打印出 1 2

async和await的实质

  • Promise一般用来解决层层嵌套的回调函数
  • async/await 是消灭异步回调的终极武器
  • JS还是单线程,还是得有异步,还是得基于 event loop(轮询机制)
  • async/await 只是一个语法糖

文章参考:blog.csdn.net/DGMM_/artic…

文章参考:blog.csdn.net/qq_40282016…