开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
1. async 和 await
async 和 await 两种语法结合可以让异步代码像同步代码一样(看起来是同步的,实质上是异步的)
通俗来理解
async 的意思为异步,经常用于声明一个函数前,该函数是异步的。await 的意思为等待,就是等待一个异步方法完成
1 async
async 将 function 变为成为 async 函数
●async 内部可以使用 await,也可以不使用,因此执行这个函数时,可以使用 then 和 catch 方法
●async 函数的返回值是一个 Promise 对象
●Promise 对象的结果由 async 函数执行的返回值决定
async function funcName() {
//statements
}
- 函数体不 return 返回值,则 async 函数返回值为一个成功 fulfilled 的 Promise 对象,值为 undefined
let a = async function() {}
let res = a()
console.log(res) // Promise{<fullfilled>: undefined}
- return 结果不是一个 Promise ,则 async 函数返回值为一个成功 fulfilled 的 Promise 对象,状态值为这个内部返回值
let a = async function () {
return 'hi'
}
let res = a()
console.log(res) // Promise{<fullfilled>: 'hello'}
- 内部抛出错误,则 async 函数返回值为一个失败 reject 的 Promise 对象
let a = async function foo() {
throw new Error('出现问题了')
}
a().catch(reason => {
console.log(reason)
})
- 若函数内部返回值是一个 Promise 对象,则 async 函数返回值的状态取决于这个 Promise 对象 是resolve 还是 reject
let a = async function () {
return new Promise((resolve, reject) => {
resolve("成功了,您真可爱")
})
}
a().then(value => {
console.log(value)
})
2 await
await 相当于一个运算符,右边接一个值。一般为一个 Promise 对象,也可以是一个非 Promise 类型。
●当右接一个非 promise 类型,await 表达式返回的值就是这个值;当右接一个 promise 对象,则 await 表达式会阻塞后面的代码,等待当前 promise 对象 resolve 的值
综合 async 和 await 而言
●await 必须写在 async 函数中
●await 右侧的表达式一般为 promise 对象
●await 返回的是 promise 成功的值
●await 的 promise 失败了就会抛出异常,需要使用 try-catch 捕获处理
Promise 使用链式调用解决了传统方式回调地狱的问题,而 async-await 又进一步优化了代码的可读性
// 创建 promise 对象
const p = new Promise((resolve, reject) => {
// resolve("用户数据");
reject("失败啦!"); // 设置状态跟值
})
// await 要放在 async 函数中.
async function main() {
try {
let result = await p; // 成功的值
console.log(result);
} catch (e) {
console.log(e); // 失败的值
}
}
// 调用函数
main(); // '失败'