如何在JavaScript中调用加密货币API价格并代入数学公式计算
问题修复方案
你的代码存在两个核心问题导致无法正确读取接口返回的价格:
- 异步请求逻辑嵌套触发死循环:你在
calc函数内发起接口请求,又在请求成功的回调里再次调用calc,会无限重复发起请求,不仅占用资源还可能被接口限流。 - 异步数据同步读取逻辑错误:
$.getJSON属于异步请求,你当前把表格计算逻辑写在请求代码之外,代码执行到计算步骤时接口还没有返回结果,自然拿不到实时的HIVE价格。
你可以把HIVE价格存储为全局变量,页面初始化时仅发起一次价格请求,拿到结果后再执行计算,修复后的代码如下:
const toFix = str => (+str).toFixed(6); // 全局变量存储实时HIVE价格 let HIVEusd = 2; // 单独封装价格拉取逻辑,页面加载时仅调用一次 const fetchHivePrice = () => { $.getJSON("https://min-api.cryptocompare.com/data/price?fsym=HIVE&tsyms=USD", function(data) { HIVEusd = data.USD; $("#HIVEPrice").text(toFix(HIVEusd)); // 价格拉取成功后触发全表所有行的计算 $("tr #HIVEPrice").each((_, el) => calc($(el))); }).fail(function(dat, textStatus, error) { var err = textStatus + ", " + error; alert(err); }); } const calc = $div => { // 表格计算逻辑 const $row = $div.closest("tr") const $cells = $row.find("td"); const qty = +$cells.eq(2).text().split(" ")[0]; const val = $div.text() const res = val * qty $cells.eq(3).text(isNaN(res) ? "" : res.toFixed(4)); // 直接使用全局存储的实时价格计算 const valusd = res * HIVEusd; $cells.eq(4).text(isNaN(valusd) ? "" : valusd.toFixed(4)); }; // 页面加载完成后拉取价格 $(document).ready(fetchHivePrice);
核心修改说明:
- 新增全局变量
HIVEusd存储实时价格,避免重复发起接口请求 - 拆分价格拉取逻辑和表格计算逻辑,从根源避免死循环
- 价格拉取成功后自动触发全表计算,保证所有数值都使用最新的价格计算
内容的提问来源于stack exchange,提问作者crrdlx
相关产品推荐
相关产品推荐

