async 和 await 之失败了怎么办

下面看一下 element 中的弹出框案例

<template>
  <div>
    <el-button type="text" @click="open">点击打开 Message Box</el-button>
  </div>
</template>
<script>
export default {
  methods: {
    open () {
      this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.$message({
          type: 'success',
          message: '删除成功!'
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        })
      })
    }
  }
}
</script>

效果很简单:点击按钮弹出确认框,可以选择 确定 或者 取消

点击确定会执行 then 方法中的代码,点击 取消会执行 catch 中的代码

下面使用 async 与 await 进行改写

export default {
  methods: {
    async open () {
      await this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
      this.$message({
        type: 'success',
        message: '删除成功!'
      })
    }
  }
}

减少了一个 then 方法,但是 catch 方法的代码应该放到哪里呢?因为 then 方法中的代码都是 revole 返回后执行的代码,但是 catch 中都是 rejected 返回执行的代码

这里使用 try catch 解构就可以了

export default {
  methods: {
    async open () {
      try {
        await this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        })
        this.$message({
          type: 'success',
          message: '删除成功!'
        })
      } catch (e) {
        this.$message({
          type: 'info',
          message: '已取消删除'
        })
      }
    }
  }
}

 

### Async/Await 的使用指南及常见问题 #### 什么是 `async` `await`? `async` 是一种用于定义异步函数的关键字,而 `await` 则是一个操作符,专门用来等待一个 Promise 对象完成并返回其结果。它们共同简化了 JavaScript 中基于 Promise 的异步编程模式。 当一个函数被标记为 `async` 后,该函数会自动返回一个 Promise[^1]。如果在 `async` 函数内部有 `return` 语句,则返回的值会被包裹成一个已解析的 Promise;如果有抛出错误的操作,则会返回一个拒绝状态的 Promise。 #### 基本语法 以下是 `async/await` 的基本结构: ```javascript // 定义一个异步函数 async function myAsyncFunction() { try { const result = await somePromiseReturningFunction(); console.log(result); } catch (error) { console.error('发生错误:', error); } } myAsyncFunction(); ``` 在这里,`somePromiseReturningFunction()` 应该返回一个 Promise 对象。通过 `await` 关键字,程序会在当前线程暂停直到这个 Promise 被解决或拒绝后再继续执行后续代码[^1]。 #### 封装安全调用工具——Safe Await 实现 为了减少重复编写 `try...catch` 结构的工作量,可以通过封装来创建更简洁的安全调用方法。例如下面展示了一个名为 `safeAwait` 的通用辅助函数: ```javascript // 创建一个安全的异步调用器 async function safeAwait(promise, fallback = null) { try { return await promise; } catch (error) { console.error('执行失败:', error.message || error); return fallback; // 如果出现问题则提供回退选项 } } ``` 此函数允许开发者轻松指定备用数据作为请求失败时的结果替代品。比如在网络接口不可达的情况下,默认加载本地存储的数据或者显示友好的提示信息给最终用户查看[^1]。 #### 在实际项目中的应用案例 假设我们正在构建一个电子商务平台后端服务,并希望利用 Python 的 FastAPI 来管理订单流程。我们可以这样设计我们的 API 接口逻辑: ```python from fastapi import FastAPI app = FastAPI() @app.get("/orders/{order_id}") async def read_order(order_id: str): order_details = await fetchOrderDetailsFromDatabase(order_id) if not order_details: raise HTTPException(status_code=404, detail="Order Not Found") return {"order": order_details} # 模拟数据库查询过程 async def fetchOrderDetailsFromDatabase(order_id: str): # Simulate an asynchronous database call here... pass ``` 在这个例子中可以看到如何结合Python里的`async def`以及相应的业务处理逻辑一起工作以达到高效并发的目的[^2]。 #### 常见误区与解决方案 1. **忘记将函数声明为 async**: 只有在 `async` 函数内才能正常使用 `await` 。否则会导致 SyntaxError。 2. **不恰当的位置放置 await**: 需要确保只针对那些确实会产生延迟的任务才去加 `await`, 过度滥用会影响性能表现. 3. **忽略错误捕捉机制**: 即使用了 `await`, 若未妥善设置好异常处理器仍可能导致整个应用程序崩溃停止运行.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴山却话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值