求助:D3 v5中d3.json()回调代码未执行,无法加载GeoJSON
解决D3 v5中d3.json()回调代码不执行的问题
嘿,我之前也踩过这个坑!你的问题核心是D3 v5彻底改变了异步数据加载API的写法——它不再支持旧版本里直接传入回调函数的方式,而是改用Promise来处理异步操作,所以你写的那个回调函数根本不会被执行,浏览器自然就跳过了里面的代码。
为什么旧写法失效?
在D3 v4之前,d3.json()确实支持传入回调函数,但从v4开始就逐步转向Promise,到v5更是完全移除了回调参数的支持。你现在的写法是旧版本的用法,在v5里完全不生效。
正确的写法有两种:
1. 使用Promise的.then()链式调用
这是最常用的方式,符合D3 v5的API规范:
d3.json("/trip_animate/tripData.geojson") .then(function(data) { console.log("It just works"); // 在这里编写你的绘图逻辑,比如生成路径、绑定数据等 }) .catch(function(error) { // 一定要加上错误处理,排查加载失败的原因 console.error("GeoJSON文件加载失败:", error); });
2. 使用async/await语法(更简洁)
如果你的代码在异步函数中,可以用await来简化异步操作:
async function loadTripData() { try { const data = await d3.json("/trip_animate/tripData.geojson"); console.log("It just works"); // 后续的绘图代码写在这里 } catch (error) { console.error("GeoJSON文件加载失败:", error); } } // 调用这个异步函数 loadTripData();
额外排查要点
- 打开浏览器的Network面板,查看GeoJSON文件的请求状态:如果是404,说明文件路径写错了;如果是跨域错误,说明你直接用
file://协议打开本地文件,需要启动一个本地服务器(比如用Python的python -m http.server)来加载文件。 - 确认D3 v5的脚本已经正确引入,没有版本冲突。
内容的提问来源于stack exchange,提问作者camelCaseCowboy
相关产品推荐
相关产品推荐

