【源码共读】第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!!!

相关推荐
Laurence7 分钟前
从零到一构建 C++ 项目(IDE / 命令行双轨实现)
前端·c++·ide
雯0609~17 分钟前
hiprint-官网vue完整版本+实现客户端配置+可实现直接打印(在html版本增加了条形码、二维码拖拽等)
前端·javascript·vue.js
GISer_Jing19 分钟前
构建高性能Markdown引擎开发计划
前端·aigc·ai编程
CHU72903537 分钟前
生鲜商城小程序前端功能版块:适配生鲜采购核心需求
前端·小程序
huangyiyi666661 小时前
Vue + TS 项目文件结构
前端·javascript·vue.js
0思必得01 小时前
[Web自动化] Selenium处理Cookie
前端·爬虫·python·selenium·自动化
徐同保1 小时前
react-markdown使用
前端·react.js·前端框架
2601_949857431 小时前
Flutter for OpenHarmony Web开发助手App实战:CSS参考
前端·css·flutter
无法长大1 小时前
如何判断项目需不需要用、能不能用Tailwind CSS
前端·css·vue.js·elementui·vue3·tailwind css
橙露1 小时前
移动端前端适配:Rem、VW/VH 与媒体查询的综合应用指南
前端·媒体