javascript - 使用 vanilla D3.js 加载数据
问题描述
我是 Javascript 新手,在 D3.js 的上下文中我似乎无法掌握 Promises 的窍门。例如,下面的代码应该用我格式化的 csv 数据填充“数据”常量,而是用包装我格式化的 csv 数据的承诺填充。
data = (async function(){
//the problem line
const data = await d3.csv("{{url_for('static', filename='d3test.csv')}}");
const columns = data.columns.slice(1);
return {
y: "Sales",
series: data.map(d => ({
name: d.Variations.replace(/, ([\w-]+).*/, " $1"),
values: columns.map(k => +d[k])
})),
dates: columns.map(d3.utcParse("%Y-%m-%d"))
};
})();
Observable.hq 中有效的同一行是:
const data = d3.csvParse(await FileAttachment("d3test.csv").text());
我想使用 vanilla javascript,而不是 observable.hq 嵌入。
编辑:我正在使用 D3 v5.min
解决方案
我通过决定实际嵌入我的 Observable.hq 笔记本解决了我的问题。人们会说“Observable.hq 不是普通的 Javascript”,但忽略了大多数 D3.js 教程和参考资料都使用 Observable.hq ......所以几乎没有机会学习正确的 Javascript(矛盾修饰词很多吗?)。
对解决方案有帮助的是: Observable:高级嵌入和下载 Observable Github 上的常见示例(自定义数据之一)
我在 Flask 模板中的工作代码(除了工作的 Observable Notebook 之外)是:
const main = new Runtime().module(notebook, Inspector.into("#graphDiv"));
(async function() {
main.redefine("data", (async function(){
const data = await d3.csv('{{url_for("static", filename=g.pt)}}');
const columns = data.columns.slice(1);
return {
y: "Sales",
series: data.map(d => ({
name: d.Variations.replace(/, ([\w-]+).*/, " $1"),
values: columns.map(k => +d[k])
})),
dates: columns.map(d3.utcParse("%Y-%m-%d"))
};
})())
})();
</script>
该代码加载整个笔记本,然后替换单个单元格/变量。没有太大的不同,我仍然有点困惑,但现在可以了。虽然值得注意的是其他单元格需要覆盖 - 使用 CSS 可见性完成。仍然是一个 hacky 解决方案。
推荐阅读
- cpu-architecture - 计算机系统架构考试题帮助我
- r - 在矩阵值函数上使用 R 中的外部
- python - Python bytearray 从变异序列初始化
- android - RecyclerView 创建额外的空间,即使宽度是匹配父级并且高度是包装内容
- sql-server - 具有 OPENROWSET 多个条件的 LDAP ADSDSOObject
- javascript - 检查 2 个数组的值并将相似的值保存在第 3 个数组中
- java - 如果在 JavaFX 中单击了 HBox 中的按钮,如何获取 HBox
- javascript - 为什么使用 Django 时 Okta-React Login 会重定向到空白页面?
- javascript - 如何在铬中增加本地存储内存?
- vue.js - 在 CKedtior5 和 Vue2 中将自定义 CSS 类添加到元素 `.ck-content`