【源码共读】第21期 | await-to-js 如何优雅的捕获 await 的错误

1. 前言

2. await-to-js

await-to-js这个库解决了什么问题?

用于帮助处理基于 promise 的异步函数的错误和异常。

在 JavaScript 的 async/await 语法中,如果 await 的函数抛出一个错误,你必须使用 try/catch 语句来捕获并处理这个错误。

3. 源码解析

源码比较简单就是通过高阶函数传入执行函数,在内部通过try...catch进行错误捕获,返回正常的数据。

js 复制代码
function to<T, U = Error>(
  promise: Promise<T>,
  errorExt?: object
): Promise<[U, undefined] | [null, T]> {
// 返回promise
  return promise
    .then<[null, T]>((data: T) => [null, data])
    .catch<[U, undefined]>((err: U) => {
    // 关键点:当抛出错误,捕获后返回正常的数据
      if (errorExt) {
        const parsedError = Object.assign({}, err, errorExt);
        return [parsedError, undefined];
      }

      return [err, undefined];
    });
}

场景应用:

在项目中,我们通过axios进行接口请求,当接口请求前需要loading展示,接口正常时可以正常关闭。接口错误是如果不进行错误捕获,会一直加载中。

代码如下:

项目中使用code进行判断是否正常返回,所以代码改造和正常的返回格式保持一致。

js 复制代码
// 未进行错误捕获
tableLoading = true
const res = axios('/api/getList')
if(res.code===1){
    tableData = res.data
}
tableLoading = false
// 上面接口报错,阻塞后续代码执行,就需要添加错误处理
try{
    tableLoading = true
    const res = fetch('/api/getList')
    if(res.code===1){
        tableData = res.data
    }
}finally{
    tableLoading = false
}

所以参考await-to-js进行改造

js 复制代码
const axios = axios.create({
  baseURL: process.env.VUE_APP_API,
})

axios.interceptors.request.use(
  (config) => config,
  (error) => Promise.reject(error)
)

axios.interceptors.response.use(
  (response) => response, 
  (error) => Promise.reject(error)
)

async function request(method, url, config) {
  try {
    const res = await axios.request({
      method,
      url,
      ...config,
    })

    return res.data
  } catch (error) {
    // NOTE:拦截网络错误返回错误body
    return {
      code: 0,
      errorCode: '',
      errorDesc: '',
      data: null,
      msg: '网络错误',
      error,
    }
  }
}

axios的错误传播链,参考下前端错误传播,通过上面的改造后,就不需要每次进行错误捕获。

4. 总结

本次学习主要有:

  • 理解 JavaScript 中的错误处理和异常抛出机制
  • 了解了错误优先回调(Error-First Callback)
  • 对于错误的处理,都返回[err,data]适配了不同错误的处理,省略每次写try...catch的烦恼

O^O!!!

相关推荐
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax