一.什么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)
})

        这里 resolvereject 是两个函数:

                调用 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 就像是给异步操作加上了“暂停键”,让异步代码像同步逻辑一样顺序执行,读起来更自然、更易懂。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐