async await
含义
- async:异步。放在函数前面表明该函数为异步函数。
- await:等待一个异步方法执行完成。
- await只能出现在async函数中。
作用
async作用
从上图可知:async函数返回的是一个Promise对象。如果在函数中return一个直接量,async会把这个直接量通过Promise.resolve()封装成Promise对象。
如果没有用await,要想打印出返回值则需要.then()来处理Promise对象。如下:
在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二致。
await作用
可以认为 await 是在等待一个 async 函数完成。await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,就是没有特殊限定)。所以,await后面实际是可以接普通函数调用或者直接量的。如下:
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()
执行顺序
- 代码中存在 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 只是一个语法糖