将异步函数中获取的股票API数据保存到全局变量时返回空数组的问题求助
问题分析与解决方案
这个问题本质是异步代码的执行顺序导致的,我来一步步给你拆解:
为什么打印出空数组?
你写的main是异步函数,里面的await会暂停函数执行,等待API请求完成。但你在全局作用域直接调用console.log(data),这行代码是同步执行的——它会在main函数里的API请求完成、data = newData赋值之前就运行,所以此时data还是初始的空数组[]。
另外还有个小细节:你代码里定义了main函数,但没调用它!这也是容易忽略的坑哦!
修复方案
我给你几种可行的解决方式,选适合你环境的就行:
方案1:在异步函数内部打印/处理数据
把console.log放到main函数里,确保在数据赋值完成后再执行:
const yahooStockAPI = require('yahoo-stock-api'); let data = []; async function main() { const startDate = new Date('07/01/2021'); const endDate = new Date('07/25/2021'); // 注意:API返回的是包含response数组的对象,如果你只需要股票数据数组,要取response const newData = await yahooStockAPI.getHistoricalPrices(startDate, endDate, 'AAPL', '1d'); data = newData.response; // 这里取response才是你要的数组 console.log(data); // 此时数据已经正确赋值 }; main(); // 别忘了调用main函数!
方案2:用.then()处理异步函数的返回值
如果不想把所有逻辑都塞到main里,可以利用异步函数返回Promise的特性:
const yahooStockAPI = require('yahoo-stock-api'); let data = []; async function main() { const startDate = new Date('07/01/2021'); const endDate = new Date('07/25/2021'); const newData = await yahooStockAPI.getHistoricalPrices(startDate, endDate, 'AAPL', '1d'); return newData.response; }; // 等待main执行完成后再处理数据 main().then((stockData) => { data = stockData; console.log(data); // 这里可以继续写保存CSV的逻辑 });
方案3:使用顶层await(Node.js 14.8+或支持的环境)
如果你的运行环境支持顶层await(比如新版Node.js、现代浏览器模块),可以直接在全局作用域等待main执行:
const yahooStockAPI = require('yahoo-stock-api'); let data = []; async function main() { const startDate = new Date('07/01/2021'); const endDate = new Date('07/25/2021'); const newData = await yahooStockAPI.getHistoricalPrices(startDate, endDate, 'AAPL', '1d'); return newData.response; }; // 顶层await直接等待异步操作完成 data = await main(); console.log(data); // 接下来就可以处理保存CSV的逻辑了
额外提醒
你提到最终要把数组保存为CSV,记得API返回的newData是一个包含error、currency、response的对象,真正的股票数据数组在newData.response里,别直接把整个对象存成CSV哦!
内容的提问来源于stack exchange,提问作者user139442
相关产品推荐
相关产品推荐

