加密货币价格ticker开发:全局变量导出失败问题求助
解决异步赋值变量导出undefined的问题
嘿,这个问题我太熟悉了!你遇到的核心问题就是JavaScript异步操作的执行顺序——你的exports.price = btcPrice是同步执行的,而axios.get和外层的setTimeout都是异步任务,会被放到事件队列里等待执行。所以当模块完成导出的时候,btcPrice还没被赋值,自然就是undefined了。
下面给你几个实用的解决方案,按推荐程度排序:
方案1:导出Promise(最推荐)
这种方式能让调用方明确知道数据是异步加载的,避免拿到undefined。我们可以维护一个始终指向最新价格Promise的变量,同时定时更新它:
const axios = require('axios'); // 存储最新价格的Promise let latestPricePromise = null; // 封装获取价格的函数 function fetchBtcPrice() { latestPricePromise = axios.get("https://api.cryptonator.com/api/ticker/btc-usd") .then(response => response.data.ticker.price); return latestPricePromise; } // 初始获取一次价格 fetchBtcPrice(); // 每10秒更新一次价格 setInterval(fetchBtcPrice, 10000); // 导出获取最新价格的方法 module.exports.getLatestBtcPrice = () => latestPricePromise;
调用方使用的时候,只需要等待Promise完成:
const btcModule = require('./你的模块文件名'); // 用then方式 btcModule.getLatestBtcPrice().then(price => { console.log('当前BTC价格:', price); }); // 或者用async/await(更简洁) async function logBtcPrice() { const price = await btcModule.getLatestBtcPrice(); console.log('当前BTC价格:', price); } logBtcPrice();
方案2:导出获取最新值的函数
如果不想用Promise,也可以导出一个函数,让调用方主动获取最新的btcPrice值:
const axios = require('axios'); let btcPrice; function fetchBtcPrice() { return axios.get("https://api.cryptonator.com/api/ticker/btc-usd") .then(response => { btcPrice = response.data.ticker.price; return btcPrice; }); } // 初始加载+定时更新 fetchBtcPrice(); setInterval(fetchBtcPrice, 10000); // 导出获取函数 module.exports.getBtcPrice = () => btcPrice;
调用的时候要注意,如果调用太早(比如初始请求还没完成),还是会拿到undefined,所以最好加个延迟或者结合初始Promise:
const btcModule = require('./你的模块文件名'); // 等初始请求完成后再获取 setTimeout(() => { console.log('当前BTC价格:', btcModule.getBtcPrice()); }, 6000);
方案3:使用事件发射器通知更新
如果需要在价格更新时主动通知调用方,可以用Node.js的events模块:
const axios = require('axios'); const EventEmitter = require('events'); const priceEmitter = new EventEmitter(); let btcPrice; function fetchBtcPrice() { axios.get("https://api.cryptonator.com/api/ticker/btc-usd") .then(response => { btcPrice = response.data.ticker.price; // 触发价格更新事件 priceEmitter.emit('priceUpdated', btcPrice); }); } // 初始加载+定时更新 fetchBtcPrice(); setInterval(fetchBtcPrice, 10000); // 导出事件监听和获取方法 module.exports = { getBtcPrice: () => btcPrice, onPriceUpdate: (callback) => priceEmitter.on('priceUpdated', callback) };
调用方可以监听价格更新事件:
const btcModule = require('./你的模块文件名'); // 监听价格变化 btcModule.onPriceUpdate(price => { console.log('BTC价格更新啦:', price); }); // 也可以主动获取当前价格 setTimeout(() => { console.log('当前BTC价格:', btcModule.getBtcPrice()); }, 6000);
总结一下,方案1是最稳妥的,因为它从根源上处理了异步加载的问题,调用方不会意外拿到undefined。
内容的提问来源于stack exchange,提问作者Setheroni
相关产品推荐
相关产品推荐

