You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON端点不存在时如何编写If/else逻辑保证函数正常返回值

问题根源

代码抛出错误和判断条件里的undefined没有关系,核心是两个缺失的校验逻辑:

  • 没有校验HTTP请求状态:当端点不存在、请求出错时,XHR返回的HTTP状态码不是200,xhr.responseText可能是错误页面内容、空字符串,直接执行JSON.parse()会直接抛出语法错误。
  • 没有做深层属性的安全读取:你直接链式访问weather.MRData.RaceTable.Races[0].Sprint.date,只要访问链路里任意一级属性不存在(比如目标赛事根本没有Sprint字段),JS就会抛出Cannot read properties of undefined的类型错误,你只判断最后一级date是否为undefined,完全覆盖不到中间层级缺失的场景。
修复代码

修复逻辑分三层:先校验请求是否成功,再捕获JSON解析异常,最后用安全方式读取深层属性,所有异常场景都统一返回默认的空字符串即可:

var main = function(){
  json_url = "http://ergast.com/api/f1/current/last.json";
  xhr = new XMLHttpRequest();
  xhr.open("GET", json_url, false);
  xhr.send(null);

  let race = " ";
  // 先判断请求是否成功,状态码200才继续处理
  if (xhr.status !== 200) return race;

  try {
    weather = JSON.parse(xhr.responseText);
    // 用可选链?.安全读取深层属性,任意一层不存在就返回undefined
    // 配合空值合并运算符??,值为null/undefined时直接返回默认空值
    race = weather?.MRData?.RaceTable?.Races?.[0]?.Sprint?.date ?? " ";
  } catch (err) {
    // 捕获JSON解析失败、结构异常的所有错误,返回默认值
    race = " ";
  }

  return race;
}
补充说明
  • 不需要把判断条件里的undefined换成其他值,可选链+空值合并的写法已经覆盖了所有层级属性不存在的场景,比逐层写if判断简洁很多。
  • 同步XHR请求会阻塞主线程执行,用户体验很差,正式环境建议替换为异步请求或者fetch写法。

内容的提问来源于stack exchange,提问作者KICK1O1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:06:28