async-await
ES6 引入了 async
和 await
关键字,用于简化异步编程。它们使得异步代码的编写更像同步代码,提高了可读性和可维护性。
async
一种异步编程的解决方案,它可以让异步代码像同步代码一样。async
函数的返回值是一个 Promise
对象。
async function foo() {
console.log('123')
return 'success' // 相当于调用 resolve( 'success' )
}
const result = foo()
console.log(result)
如果 async
的返回值不是一个 Promise
对象,那么它返回的 Promise
是成功状态的 Promise
,async
函数的返回值会被放入 resolve(data)
中。
async function foo() {
console.log('123')
throw new Error('fail') // 返回失败的 Promise, 详单与调用 reject( 'fail' )
}
const result = foo()
console.log(result)
返回值为 Promise
:
async function foo() {
console.log('123')
return new Promise((resolve, reject) => {
resolve('成功')
})
}
const result = foo()
console.log(result)
await
await
关键字只能在 async
函数中使,它会等待一个 Promise
对象的结果。使用 await
可以让异步代码看起来像同步代码一样,避免了回调地狱。
await
必须写在async
函数中await
右侧的表达式一般为Promise
对象await
返回的是成功状态的Promise
的值await
中的Promise
如果失败,就会抛出异常,需要用try-catch
捕获
const p = new Promise((resolve, reject) => {
resolve('success')
})
async function foo() {
let result = await p
console.log(result) // success
}
foo()
const p = new Promise((resolve, reject) => {
reject('失败')
})
async function foo() {
try {
let result = await p
} catch (e) {
console.log(e) // 失败
}
}
foo()