async异步函数
async 关键字用于声明一个异步函数
// 写法一:
async function foo1() {
}
// 写法二:
const foo2 = async () => {
}
// 写法三:
class Foo {
async bar() {
}
}
async异步函数与普通函数的区别
1. 返回值
函数的返回值为promise对象
- 如果返回值是一个非Promise类型的数据,返回的是一个成功的Promise对象
- 如果返回值是一个Promise类型的对象,Promise类型的对象的结果就是这个Promise对象的结果
- 抛出异常的话,返回的是一个失败的Promise对象
2. 异常
普通函数:
function foo() {
console.log("foo function start~")
console.log("中间代码~")
throw new Error("error message")
console.log("foo function end~")
}
foo().catch(err => {
console.log("error message:", err)
})
console.log("后续还有代码~~~~~")
// 输出抛出异常前面的代码并抛出异常,后面代码不执行
异步函数:
async function foo() {
console.log("foo function start~")
console.log("中间代码~")
// 异步函数中的异常, 会被作为异步函数返回的Promise的reject值的
throw new Error("error message")
console.log("foo function end~")
}
foo().catch(err => {
console.log("error message:", err)
})
console.log("后续还有代码~~~~~")
// 后续代码会被执行,之后打印错误信息
如果我们在async中抛出了异常,那么程序它并不会像普通函数一样报错,而是会作为Promise的reject来传递;
await关键字
await 表达式会暂停整个 async 函数的执行进程并出让其控制权,只有当其等待的基于 promise 的异步操作被兑现或被拒绝之后才会恢复进程。promise 的解决值会被当作该 await 表达式的返回值。
function requestData1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1111)
}, 2000);
})
}
function requestData2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(222)
}, 3000);
})
}
async function foo1() {
// 1.await跟上表达式
const res1 = await requestData1()
// 2. await跟上其他值
const res2 = await 123 // "await" 对此表达式的类型没有影响
console.log("后面的代码1", res1)
console.log("后面的代码2", res2)
}
foo1()
// 3.reject值
async function foo2() {
try {
const res3 = await requestData2()
console.log("res3:", res3)
} catch (error) {
console.log(error);
}
}
foo2().catch(err => {
console.log("err:", err)
})
await 表达式
await
右侧的表达式一般为promise
对象,但也可以是其他的值- 如果表达式是
promise
对象,await
返回的是promise
成功的值 - 如果表达式是其他值,直接将此值作为await的返回值
await xxx
是同步的,但await
下面的代码都是相当于.then里的(微任务)
注意
await
必须写在async
函数中,但async
函数中可以没有await
- 如果
await
的promise
失败了,就会抛出异常,需要通过try...catch
捕获处理