JavaScript函数get_coin_price_BTC未返回预期数值问题求助
解决get_coin_price_BTC函数无返回值的问题
这个问题我之前也碰到过,核心是没搞清楚异步操作的执行顺序!你看,binance.prices()是一个异步API调用,它的回调函数要等Binance的API返回数据后才会执行,但你的return x;语句在这个回调执行前就跑了——这时候x还是初始的空字符串,所以函数自然返回不了预期的数值。
解决方案1:用Promise封装(推荐现代JS写法)
把函数改成返回Promise的形式,这样就能正确等待异步操作完成后返回价格:
function get_coin_price_BTC(coin) { return new Promise((resolve, reject) => { binance.prices(function(ticker) { const pair = (coin + "btc").toUpperCase(); const price = ticker[pair]; console.log("Price of " + pair + ": " + price); if (price) { resolve(parseFloat(price)); // 转成数值类型返回,符合你的需求 } else { reject(new Error(`找不到交易对 ${pair} 的数据`)); } }); }); }
调用的时候可以用async/await(更直观):
async function fetchBTCPrice() { try { const ethPrice = await get_coin_price_BTC("eth"); console.log("ETH/BTC 价格:", ethPrice); // 这里可以直接用ethPrice做后续逻辑 } catch (err) { console.error("获取价格失败:", err.message); } } fetchBTCPrice();
或者用传统的.then()链式调用:
get_coin_price_BTC("bnb") .then(price => console.log("BNB/BTC 价格:", price)) .catch(err => console.error("出错了:", err.message));
解决方案2:用回调函数(兼容旧代码场景)
如果不想用Promise,也可以给函数加个回调参数,在异步操作完成后调用回调传递结果:
function get_coin_price_BTC(coin, callback) { binance.prices(function(ticker) { const pair = (coin + "btc").toUpperCase(); const price = ticker[pair]; console.log("Price of " + pair + ": " + price); if (price) { callback(null, parseFloat(price)); // 成功时第一个参数传null,第二个传价格 } else { callback(new Error(`交易对 ${pair} 不存在`)); // 失败时传错误对象 } }); }
调用方式:
get_coin_price_BTC("sol", (err, price) => { if (err) { console.error("获取价格失败:", err.message); return; } console.log("SOL/BTC 价格:", price); // 后续操作写在这里 });
为什么原来的代码不行?
再给你捋一遍执行顺序:
- 调用
get_coin_price_BTC("eth"),初始化x = "" - 调用
binance.prices(),发起API请求(这一步是异步的,不会阻塞代码) - 直接执行
return x;,此时x还是空字符串,函数返回 - 过了一会儿,Binance API返回数据,回调函数执行,把x赋值为正确的价格,但这时候函数已经返回了,根本拿不到这个值!
内容的提问来源于stack exchange,提问作者user1698144
相关产品推荐
相关产品推荐

