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

如何在module.exports函数中通过d3.json返回数据?

解决d3.json异步读取后返回数据的问题

嗨,这个问题的核心其实是异步操作的执行顺序——d3.json是异步请求,你的同步return语句会在请求完成前就执行了,所以才会一直拿到undefined。咱们先分析下你之前的尝试哪里不对,再给出可行的解决方案:

为什么之前的写法都失败了?

  • 第一种写法:你在d3.json的回调函数里return data,但这个return只属于回调函数,不是外层module.exports函数的返回值,所以外部调用时根本拿不到这个结果。
  • 第二种写法:你定义了out变量,但函数在d3.json请求完成前就return out了,此时out还没被赋值,自然是undefined。
  • 第三种写法:用this.out的方式存在this指向问题(module.exports的函数里this默认不是你想的上下文),而且同样没解决异步执行顺序的问题,所以抛出了TypeError。

正确的解决方案

方案1:使用回调函数(传统异步处理方式)

让你的导出函数接收一个回调参数,在d3.json请求完成后调用这个回调传递数据:

const d3 = require('d3')
module.exports = (callback) => {
  const jsonfile = 'link/to/json/file.json'
  d3.json(jsonfile, (err, data) => {
    if (err) {
      return callback(err) // 把错误传给回调
    }
    callback(null, data) // 成功时传递数据
  })
}

调用模块时:

const fetchJsonData = require('./你的模块文件名.js')
fetchJsonData((err, data) => {
  if (err) {
    console.error('读取JSON出错:', err)
    return
  }
  // 这里就能拿到正确的数据了
  console.log('获取到的数据:', data)
})

方案2:返回Promise(现代推荐写法)

从d3 v5开始,d3.json已经支持返回Promise了,我们可以直接返回这个Promise,让调用方用.then()或者async/await处理:

const d3 = require('d3')
module.exports = () => {
  const jsonfile = 'link/to/json/file.json'
  // 直接返回d3.json的Promise,同时捕获错误
  return d3.json(jsonfile)
    .catch(err => {
      console.error('读取JSON文件失败:', err)
      throw err // 把错误抛出,让调用方处理
    })
}

调用方式1:用.then()链式调用

const fetchJsonData = require('./你的模块文件名.js')
fetchJsonData()
  .then(data => {
    console.log('获取到的数据:', data)
    // 在这里处理你的数据逻辑
  })
  .catch(err => {
    // 统一处理错误
    console.error(err)
  })

调用方式2:用async/await(更简洁)

const fetchJsonData = require('./你的模块文件名.js')

// 必须在async函数里使用await
async function processData() {
  try {
    const data = await fetchJsonData()
    console.log('获取到的数据:', data)
    // 处理数据逻辑
  } catch (err) {
    console.error('处理数据出错:', err)
  }
}

processData()

总结

异步操作的核心是:不能用同步的思维去等待异步结果,必须通过回调、Promise这类机制来处理异步完成后的逻辑。现在更推荐使用Promise+async/await的写法,代码更清晰易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:18:43