async 和 await
async和await是ES2016新增的两个关键字,它们借鉴了ES2015中生成器在实际开发中的应用,目的是简化Promise API的使用,并非是替代Promise
async
async用于修饰函数,放置在函数最开始的位置,被修饰函数的返回结果一定是Promise对象
演示:
async function test() {
console.log(1)
return 2
}
等效于下面
function test() {
return new Promise((resolve, reject) => {
console.log(1)
resolve(2)
})
}
await
await关键字必须出现在async函数中
await用于某个表达式之前,如果表达式返回的是一个Promise对象,则得到的是thenable中的状态数据
示例:
async function test1() {
console.log(1)
return 2
}
async function test2() {
const result = await test1()
console.log(result) // 2
// 上面两行代码相当于下面这么多行代码
// return new Promise((resolve, reject) => {
// test1().then(data => {
// const result = data
// console.log(result)
// resolve()
// })
// })
}
test2()
await后面如果不是一个Promise对象呢?
答案:使用Promise.resolve()直接包装
async function test() {
const result = await 1
console.log(result)
}
test()
等效于下面
function test() {
return new Promise((resolve, reject) => {
Promise.resolve(1).then(data => {
const result = data
console.log(result)
resolve()
})
})
}
async和await如何处理错误情况呢?
答案:使用try catch
async function getPromise() {
if (Math.random() < 0.5) {
return 1
} else {
throw 2
}
}
async function test() {
try {
const result = await getPromise()
console.log('正常状态', result)
} catch(error) {
console.log('错误状态', error)
}
}
网友评论