Javascript Fetch API:如何确定错误是否为网络错误

Javascript Fetch API:如何确定错误是否为网络错误,javascript,fetch-api,Javascript,Fetch Api,所以我有一些类似这样的代码: 异步函数getData(){ 常量响应=等待获取(/*…*/); const json=await response.json(); 返回转换(json); } 其中,transform可以抛出它自己的一些错误 我正在尝试从fetchAPI捕获网络错误 试试看{ const data=wait getData(); // ... 返回/。。。 }捕获(e){ 如果(isNetworkError(e)){ 返回localStorage.getItem(“…”);

所以我有一些类似这样的代码:

异步函数getData(){ 常量响应=等待获取(/*…*/); const json=await response.json(); 返回转换(json); } 其中,
transform
可以抛出它自己的一些错误


我正在尝试从
fetch
API捕获网络错误

试试看{
const data=wait getData();
// ...
返回/。。。
}捕获(e){
如果(isNetworkError(e)){
返回localStorage.getItem(“…”);
}
投掷e;
}
我的问题是如何实现跨浏览器工作的
isNetworkError
注意:只有在网络脱机时,此选项才应返回true

chrome和firefox似乎都抛出了一个
TypeError
,但它们各自的消息不同

  • Firefox:
    TypeError:“尝试获取资源时出现网络错误。”
  • Chrome:
    TypeError:获取失败

如果第一个承诺被拒绝,那就是网络错误。这是唯一的一次

从fetch()返回的承诺不会在HTTP错误状态下拒绝 即使响应是HTTP 404或500。相反,它会解决问题 正常情况下(ok状态设置为false),它只会在 网络故障或任何阻止请求完成的情况

从Mozilla开发者页面:
我没有一个完美的答案给你。解决确切问题的最简单方法是将
isNetworkError
实现为类型保护。也许firefox/chrome错误对象上有一些公共属性,允许您专门检测这些属性

另一种方法是捕捉更接近您执行
fetch()
操作的错误,并将错误重新显示为您可以轻松检测到的内容

async function getData() {
  let response;

  try {
    response = await fetch(/* ... */);
  } catch (err) {
    throw new MyCustomNetworkError(err.message);
  }
  const json = await response.json();
  return transform(json);
}