Date
我试图通过将一个新对象传递给函数来使 D3 每秒更新一次 SVG 元素data()
,然后join()
更新页面。我实际上是在Observable笔记本中使用Promises.tick()
的,但我认为下面的代码(完整源代码)是相关位的粗略近似。我的最终目标是制作一个时钟,但这里的代码是我遇到的问题的最小演示。
这段代码的问题是update
函数 injoin()
永远不会被调用——每次循环时enter
都会调用该函数,这导致text
每次都追加一个新函数。由于我有一个数据和一个元素,我希望join
'supdate
被调用,而不是enter
。我知道data()
( example ) 上的 key 函数对于确定发生了什么变化很重要,但我的理解是默认键是数组索引,这里应该始终为 0。无论如何,指定一个不同的键函数(从标识函数到返回一个常数)并没有帮助。
while (true) {
var data = [new Date()];
svg
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.selectAll("text")
.data(data)
.join(
enter => enter.append("text").text(d => "enter: " + d),
update => update.text(d => "update: " + d)
);
await new Promise(resolve => setTimeout(resolve, 1000));
}