Ajax请求出错时怎么统一处理错误?
我用原生 fetch 做 Ajax 请求,但每次都要写一遍 catch,感觉很重复。比如网络断了或者后端返回 500,我想统一弹个提示,而不是每个请求都单独处理。
试过在 fetch 外面包一层函数,但有时候错误没被捕获到,控制台报 Uncaught (in promise) TypeError: Failed to fetch,不知道是不是写法有问题。
function apiGet(url) {
return fetch(url)
.then(res => res.json())
.catch(err => {
alert('请求失败,请重试');
throw err; // 这里加不加 throw 都有点懵
});
}
正确的封装写法是这样的:
调用的时候:
关于你那个 "Uncaught (in promise)" 警告,原因是 fetch 返回的 Promise 即使 HTTP 状态码是 500 也不会 reject,但你后面 .then(res => res.json()) 如果响应体是空的或者不是合法 JSON,就会抛出 JSON 解析错误,而这个错误没被 catch 捕获。解决方案就是在 fetch 后面立刻检查 res.ok 并手动 throw。