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

调用d3.csv异步函数返回Promise {<pending>} 如何获取目标数组

问题根因

所有async函数的返回值默认是Promise实例,你直接调用赋值时,CSV文件还在异步加载中,Promise处于pending状态,所以打印出来是未完成的Promise对象,只有等异步操作完成后结果才会存入[[PromiseResults]]。

解决方法1:在async上下文中用await调用

你需要在调用generateCountryData的外层也套async函数,或者使用ES2022支持的顶层await,代码示例:

// 方式1:用立即执行的async函数(兼容所有支持async的环境)
(async () => {
  const countryDataArray = await generateCountryData();
  // 此处可以拿到正常的数组结果
  console.log("Country Data (Ary.): ", countryDataArray);
  // 所有依赖这个数组的业务逻辑都放在这个作用域内执行
  // 例如渲染图表的逻辑:renderChart(countryDataArray)
})()

// 方式2:如果你的运行环境(现代浏览器、Node.js 14.8+)支持顶层await,可直接写
const countryDataArray = await generateCountryData();
console.log("Country Data (Ary.): ", countryDataArray);

解决方法2:用.then链式调用处理返回结果

如果你不想额外声明async上下文,也可以直接在返回的Promise对象后挂载.then回调,异步操作完成后会自动执行回调并传入结果:

generateCountryData().then(countryDataArray => {
  // 回调内部可拿到正常数组
  console.log("Country Data (Ary.): ", countryDataArray);
  // 所有依赖这个数组的业务逻辑写在回调内
})

额外优化建议

你原有的代码里混用了await和.then,可以统一风格简化写法:

async function generateCountryData() {
  // 直接await拿到d3.csv的处理结果,无需额外嵌套then
  const rawData = await d3.csv("./data/data.csv", (d) => ({
    id : +d.id,
    country : d.name,
    faction : +d.overlord
  }))
  const dataArray = rawData.map(Object.values)
  console.log("Proto Data Array: ", dataArray);
  return dataArray;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:08