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

两次独立$.getJSON调用计算返回NaN,如何排查修复?

为什么你的代码返回NaN?两个关键问题+修复方案

嘿,你遇到的NaN问题其实是两个常见的API调用小坑导致的,咱们一步步捋清楚:

1. Fixer.io的汇率取值路径错误

你直接写data2["GBP"]是拿不到英镑汇率的!Fixer.io的latest接口返回的结构里,所有汇率都嵌套在rates对象里,简化后的返回格式大概是这样:

{
  "base": "USD",
  "date": "2024-05-20",
  "rates": {
    "GBP": 0.7912,
    // 其他货币汇率...
  }
}

所以正确的取值应该是data2.rates.GBP或者data2["rates"]["GBP"],你之前的写法拿到的是undefined,任何值和undefined相乘都会得到NaN。

2. CoinMarketCap返回的价格是字符串类型,未转成数字

CoinMarketCap返回的price_usd是字符串格式(比如"2.85"),字符串和数字/字符串相乘时,JS会尝试类型转换,但如果转换失败就会生成NaN。所以必须先把这个价格转成数字类型再进行计算。

修正后的完整代码

$.getJSON("https://api.coinmarketcap.com/v1/ticker/raiblocks/", function(data) {
  // 把字符串价格转成数字,同时校验有效性
  const raiPrice = parseFloat(data[0]["price_usd"]);
  if (isNaN(raiPrice)) {
    console.error("未获取到有效的RaiBlocks美元价格");
    loader(false);
    return;
  }

  $.getJSON("https://api.fixer.io/latest?base=USD", function(data2) {
    // 正确获取英镑汇率,用可选链避免rates不存在的情况
    const gbpRate = data2.rates?.GBP;
    if (isNaN(gbpRate)) {
      console.error("未获取到有效的英镑汇率");
      loader(false);
      return;
    }

    change['rai-usd-cmc'] = raiPrice * gbpRate;
    // 直接计算后格式化,减少重复DOM操作
    $(".change-rai-usd-cmc").text(change['rai-usd-cmc'].toFixed(2));
    loader(false);
    updateData();
  })
  // 给第二个请求添加失败回调
  .fail(function() {
    console.error("汇率接口请求失败");
    loader(false);
  });
})
// 给第一个请求添加失败回调
.fail(function() {
  console.error("RaiBlocks价格接口请求失败");
  loader(false);
});

额外优化建议

  • 添加请求失败处理:代码里新增的.fail()回调,能避免API请求失败时页面一直卡在加载状态,还能在控制台看到错误原因。
  • 提前校验数值有效性:计算前检查价格和汇率是否为有效数字,避免NaN污染后续逻辑。
  • 减少DOM操作:你之前连续调用了两次.text(),现在合并成一次,减少不必要的DOM交互,提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:23:37