async/await是什么?
简单来说async/await是Promise的语法糖,async是异步的意思,await是等待的意思。async function 声明一个函数里面可能有异步代码需要执行,await则可以认为是等待一个异步方法执行完成。
async/await的用法
let people = {}
function getPeople1() {
return new Promise((resolve, reject) => {
//异步代码
setTimeout(() => {
data = { name: '张三', sex:'男' }
resolve()
}, 1000)
})
}
function getPeople2() {
return new Promise((resolve, reject) => {
//异步代码
setTimeout(() => {
data = { name: 'lily', sex:'女' }
resolve()
}, 2000)
})
}
function showPeople() {
console.log(`正在展示获取到的数据:${JSON.stringify(people)}`);
}
async function handle() {
await getPeople1()
await getPeople2()
showPeople()
}
handle()
在上面的代码中可以看到getPeople1和getPeople2两个函数中都有异步代码,用async/await来解决的话和在函数体内和使用then链解决一样,都需要return出一个Promise。不同的点就在于async新定义了一个异步函数,getPeople1和getPeople2两个函数在异步函数里面调用,然后在两个函数前面都加上await。
async/await的特点
- async函数调用会返回一个Promise对象。
async function handle() {
return 'hi'
}
const res = handle()
console.log(res);
执行结果:
- await 必须写在 async 函数里面。
async和await是配套使用的,await规定了要写在 async里面。 - await 会阻塞下一行代码的执行,封装了Promise.then()。
需要耗时的代码都是异步代码,await加在了有异步代码的函数前面,一定要等这个函数执行完毕了才会执行下面的代码,要不然就解决不了异步代码挂起的问题了。 - await也会返回出一个Promise对象。
//await
function await() {
return Promise.resolve().then(() => {
})
}
async/await的优点——和Promise比较
- 同步代码编写方式,能处理由多个Promise组成的 then 链,async/await从上到下顺序执行,更符合编写习惯。
- 同步代码和异步代码可以一起编写,用Promise最好将同步代码和异步代码放在不同的then节点中,结构更加清晰,而用async/await整个书写习惯都是同步的,不需要纠结同步和异步的区别。
- 语法简洁清晰,节省了很多不必要的匿名函数。
- 减少不必要的中间变量,更清晰明确的错误堆栈。