JavaScript async 函数的优雅的异常处理
背景
- 在开始公司的新项目时,新来的同事提出目前公司的 ajax 请求处理并不合理——不管什么情况返回结果的 HTTP 状态码都为
200
; 应改根据不同情况返回不同的 HTTP 状态码。经过讨论,新项目采用上述方式返回处理结果,所以以往项目中根据返回结果的errcode
判断是否错误的做法无法再适用,在接收400
以上的结果时必须 catch. - 使用
Promise.prototype.then().catch();
。 - 使用
async/await
然后使用try/catch
。 - 个人认为使用
try/catch
不够优雅。
有没有优雅的 async/await
异常处理?
这个问题有大佬比我先想到
- How to write async await without try-catch blocks in Javascript
- 如何在Javascript中优雅的使用Async和Await进行错误的处理?(译文)
还有对上文的引伸
解决方案
1. 方法定义
function to(promise) {
if (!promise || !Promise.prototype.isPrototypeOf(promise)) {
return new Promise((resolve, reject) => {
reject(new Error('参数必须是 promise'));
}).catch((err) => {
return [err, null];
});
}
return promise.then(data => {
return [null, data];
}).catch(err => {
return [err, null];
});
}
2. 如何使用
async function f() {
const [error, data] = await to(...);
if(error){
...
}
...
}
最后
引用 segmentfault 用户 边城 的结论
用什么方式取决于适用场景、团队约定和个人喜好等多种因素,在不同的情况下需要采用不同的处理方式,并不是说哪一种就一定好于另一种——合适的才是最好的!
欢迎转载,转载请注明出处:http://blog.kaguramea.me/archives/js-async-method-catch
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。