我以前看到请求失败就统一显示“网络错误”。这句话对用户不够准确,对排错也没有帮助,所以做了一个只有三个分支的最小实验。

先写出三个结果

第一个分支让请求直接断网,第二个请求一个不存在的路径,第三个让服务端返回一个结构合法但业务失败的 JSON。

实验结果很快把误解拆开:fetch 只有在网络层失败时才会 reject;收到 404 或 500 时,它依然会 resolve,只是 response.okfalse

这件事为什么重要

如果只写 catch,HTTP 错误会被当成成功响应继续往下解析。反过来,如果所有错误都显示成网络异常,用户会以为自己断网,开发者也会错过真正的接口问题。

现在的处理顺序是:先判断是否拿到 response,再判断 response.ok,最后才解析业务数据。每一步都对应一种可以复现的失败。

观察输出,而不是猜

最小复现的价值不是马上写出最好的封装,而是把“我以为会这样”变成浏览器实际输出。等边界稳定之后,再加超时、重试和错误提示,代码会更容易解释。

下一步

接下来会给请求封装加入 AbortController。目标不是把所有错误藏起来,而是让调用方知道:这次是超时、主动取消,还是服务端明确拒绝。