async
async
是一个修饰符,用来声明一个异步函数,async
定义的函数默认返回一个Promise
对象resolve
的结果
因此,对async
函数可以直接进行then
操作,返回的值即为then
方法中传入的函数
async function foo() {
console.log(1)
return 1
}
foo().then(res => {
console.log(res) // 1, 1
})
async function foo() {
return new Promise((resolve, reject) => {
console.log('Promise')
resolve('Promise')
})
}
foo().then(res => {
onsole.log(res) // 'Promise', 'Promise'
})
await
await
也是一个修饰符,await
关键字只能放在async
函数中使用,作用是获取Promise
中返回的内容
await
表达式会暂停当前async function
的执行,等待Promise
处理完成
若Promise
正常处理(status更改为fulfilled),其回调的resolve
函数参数作为await
表达式的值,继续执行async function
若Promise
处理异常(status更改为rejected),await
表达式会把Promise
的异常原因抛出
另外,如果await
操作符后的表达式的值不是一个Promise
,则返回该值本身
function fn() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('hello')
resolve('hello')
})
})
}
async function foo() {
const data = await fn()
console.log(data) // 'hello', 'hello'
}
async/await错误处理
使用try…catch…包裹await
表达式
function fn() {
return new Promise((resolve, reject) => {
reject('throw new error') // 使用 reject 进行错误抛出
})
}
async function foo() {
try {
await fn()
} catch (e) {
console.log(e) // 'throw new error'
}
}
async/await总结
async
函数可能包含0个或者多个await
表达式
await
表达式会暂停整个async
函数的执行进程并出让其控制权,只有当其等待的基于Promise
的异步操作被兑现或被拒绝之后才会恢复进程
Promise
的解决值会被当作该await
表达式的返回值
使用async / await
关键字就可以在异步代码中使用普通的try / catch
代码块。
await
关键字只在async
函数内有效。如果你在async
函数体之外使用它,就会抛出语法错误SyntaxError
async / await
的目的为了简化使用基于Promise
的API时所需的语法
async
函数一定会返回一个Promise
对象。如果一个async
函数的返回值看起来不是Promise
,那么它将会被隐式地包装在一个Promise
中