前言
错误处理是我们在编写高质量代码时必须面对的一大挑战,特别是在现代 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!请记得一起向更优雅的代码飞翔。