异步错误处理的优雅艺术:await-to-js

187 阅读3分钟

前言

错误处理是我们在编写高质量代码时必须面对的一大挑战,特别是在现代 JavaScript 的异步编程环境中。Promise和async/await为我们处理异步行为提供了便利,但当错误出现时,我们还在使用传统的try...catch块进行处理。这导致了大量重复的、琐碎的错误处理代码充斥在我们的业务逻辑中,使得代码变得难以阅读和维护。 是否有一种更优雅的方式来处理 async/await 中的错误,而不是充斥着 try/catch 块呢?答案是肯定的 - 这就是我们引入 await-to-js 的原因。

await-to-js 是一个小巧的库,它提供了一种利用数组解构来同时处理数据和错误的方法。这种方法可以使错误处理变得更简洁、更明确,让开发者可以专注于需要处理的数据或错误,而不是处理错误处理的语法。接下来,我们将详细介绍 await-to-js的工作原理和如何使用它来优化您的代码。

在本文中,我们将深入解析 await-to-js 的工作原理,并通过几个实战案例,展示如何利用这个小工具进行有效、优雅的错误处理。

await-to-js

await-to-js 库为处理我们的 async/await语法中的错误提供了一种清晰且明确的方法。通过使用此库提供的 to 函数,我们可以同时处理 Promise 的成功和失败情况,返回一个结构如 [error, result] 的数组。 在成功时,你会收到 [null, result],而在失败时,你会收到包含错误信息的数组 [error, undefined]。因此,你可以在一个统一的层次结构中同时处理结果和错误,无需让你的代码充满 try/catch。

源码核心部分只有 14 行,非常优雅

/**
 * @param { Promise } promise
 * @param { Object= } errorExt - Additional Information you can pass to the err object
 * @return { Promise }
 */
export function to<T, U = Error> (
  promise: Promise<T>,
  errorExt?: object
): Promise<[U, undefined] | [null, T]> {
  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];
    });
}

export default to;

活学活用 await-to-js

请看以下的实例代码:

import to from './to'; 

async function asyncOp() {
    const [error, result] = await to(someAsyncFunction());
    if (error) {
        // 处理错误
    } else {
        // 处理结果
    }
}

自定义错误处理

当你需要更详细的错误信息,或者想在错误对象中加上自定义字段如错误码,await-to-js 都能用的非常灵活。

const [err, response] = await to(someAsyncFunction(), { customError: 'Something went wrong' });
if(err) {
    console.error(err.customError);  // Output: Something went wrong
}

await-to-js 给了我们处理错误的迭代能力。我们可以定制错误对象,加入额外的错误信息,丰富了错误处理的可能性。

总结

await-to-js 提供了一种以简洁、可读的方式处理异步错误的方法,允许我们将注意力集中在业务逻辑上,而不是频繁的错误处理代码中。虽然这个工具无法解决所有的异步问题,但对于绝大多数基于 Promise 的异步代码,它都能发挥很好的作用。 感谢您阅读到这里!如果你觉得这篇文章对你有用,欢迎点赞和关注,你的支持是我创作的最大动力。对于这个主题你有任何想法或问题,都欢迎在评论区留言! 在没有 await-to-js 处理我们日常代码中的异步错误之前,让我们告别无尽的 try/catch!请记得一起向更优雅的代码飞翔。