前端-async、await、Promise
本文介绍了JavaScript中异步编程的三个核心概念:async、Promise和await。async用于声明异步函数,自动将返回值封装为Promise对象;Promise作为异步操作的状态容器,具有pending、fulfilled和rejected三种状态;await则用于在async函数中暂停执行,等待Promise完成。通过async/await组合,可以像编写同步代码一样处理异步操作
一.什么async
当你在函数前加async:
const register = async () => {}
就表明这个函数是一个异步函数。
异步函数:
无论你内部返回什么值,都会被自动封装成一个 Promise 对象。
这样函数外部就可以使用 await 或 .then() 来等待它执行完成。
async function foo() {
return 42
}
console.log(foo()) // 输出 Promise { 42 }
所以 async 其实是给函数装了一个“Promise外壳”。
二.什么是Promise对象
Promise 是 JavaScript 中处理异步操作的核心机制之一,可以把它想成一个“装着未来结果的盒子”。当你还没拿到结果时(例如网络请求还没返回),你就可以先拿着这个盒子继续做别的事,等结果出来了,再去打开它。
你可以把它理解为一个状态机对象,有三种状态:
| 状态 | 含义 | 触发时机 |
|---|---|---|
pending |
进行中 | 初始状态 |
fulfilled |
已成功 | 操作成功完成 |
rejected |
已失败 | 操作出错或被拒绝 |
并且,状态一旦改变就不会再变(不可逆)。
const p = new Promise((resolve, reject) => {
setTimeout(() => {
const success = true
if (success) {
resolve('注册成功') // 成功时调用 resolve
} else {
reject('注册失败') // 失败时调用 reject
}
}, 1000)
})
这里 resolve 和 reject 是两个函数:
调用 resolve() → 表示成功,Promise 变成 fulfilled 状态;
调用 reject() → 表示失败,Promise 变成 rejected 状态。
p.then(result => {
console.log(result) // 注册成功
}).catch(error => {
console.error(error) // 注册失败
})
.then() 处理成功的情况,.catch() 处理失败的情况。
三.什么是await
await 只能在 async 函数中使用,用来等待一个 Promise 完成。
在等待的这段时间里,JS 不会卡住整个程序(它只是暂停这个函数的执行,等结果出来再继续)。
await userRegisterService(ruleFrom.value)
这行代码的意思是:
等
userRegisterService的异步请求完成(即 Promise 变为“成功”状态)后,再往下执行。
如果这个请求失败(Promise 被 reject),就会抛出异常,可以用 try...catch 来捕获。
四.将async和await结合使用
const register = async () => {
// 1️⃣ 校验表单(这是个异步操作)
await form.value.validate()
// 2️⃣ 请求注册接口(也是异步操作)
await userRegisterService(ruleFrom.value)
// 3️⃣ 如果上面两步都成功执行,就显示提示
ElMessage.success('注册成功')
// 4️⃣ 修改状态,切换回登录界面
isRegister.value = false
}
执行顺序看起来是同步的,但实际上:
每一个 await 都在等待 Promise 完成。
如果其中任何一个步骤失败(抛出异常),下面的代码不会执行。
这比写成:
form.value.validate().then(() => {
return userRegisterService(ruleFrom.value)
}).then(() => {
ElMessage.success('注册成功')
isRegister.value = false
})
async + await 就像是给异步操作加上了“暂停键”,让异步代码像同步逻辑一样顺序执行,读起来更自然、更易懂。
更多推荐



所有评论(0)