D3.js D3:延迟后添加元素,然后转换

D3.js D3:延迟后添加元素,然后转换,d3.js,D3.js,我有一个非常大的csv文件,我正在用D3.js可视化它。其中一个数据字段是时间戳,因此(而不是一次显示所有这些信息)我希望在与时间戳成比例的延迟后创建一个svg元素(基于其他数据字段),然后在三秒钟内淡出。由于数据的大小,我无法预先创建所有元素,即使它们是不可见的;每个元素只应存在三秒钟。理想的效果是一束点突然出现,然后消失 下面是我最好的尝试。策略是使用两种过渡:延迟,然后淡入淡出过渡。它似乎不起作用,而是一次创建了所有元素(不过淡入效果很好) 编辑2015年4月自从提出这个问题以来,我们学到

我有一个非常大的csv文件,我正在用D3.js可视化它。其中一个数据字段是时间戳,因此(而不是一次显示所有这些信息)我希望在与时间戳成比例的延迟后创建一个svg元素(基于其他数据字段),然后在三秒钟内淡出。由于数据的大小,我无法预先创建所有元素,即使它们是不可见的;每个元素只应存在三秒钟。理想的效果是一束点突然出现,然后消失

下面是我最好的尝试。策略是使用两种过渡:延迟,然后淡入淡出过渡。它似乎不起作用,而是一次创建了所有元素(不过淡入效果很好)


编辑2015年4月自从提出这个问题以来,我们学到了很多东西,最明显的事情似乎是立即以0透明度插入所有内容。然后创建一个持续时间为0、可变延迟过渡到捕捉到1的不透明度,然后从那里淡入淡出。还可以使用嵌套选择来避免显式for循环。我没有试过,但应该可以用。

你试过使用setTimeout吗

        rows.forEach(function(d, i){
            setTimeout(function(){
                    plot.append("circle")
                        .attr(/*several, snip */)
                        .style("opacity", 1)
                        .transition()
                        .duration(3000)
                        .style("opacity", 0)
                        .remove()
            }, /*expression with d.timestamp*/);
        })

我知道这是老问题,但我也遇到了同样的问题,并试图用承诺来解决它,然后找到了一个比我更好的解决方案

然后


恐怕不行。在for循环中运行时,重置
d
将关闭回调。我想不出一个解决方法,但可能有一个。你必须将整个过程包装在一个函数中,以创建一个新的作用域。我已经提交了对你答案的编辑。你必须接受更改,在这一点上我可以接受答案。在我看到编辑之前,审阅者拒绝了编辑(叹气),我不知道如何接受它。我编辑使用forEach进行迭代,这也解决了问题。
        rows.forEach(function(d, i){
            setTimeout(function(){
                    plot.append("circle")
                        .attr(/*several, snip */)
                        .style("opacity", 1)
                        .transition()
                        .duration(3000)
                        .style("opacity", 0)
                        .remove()
            }, /*expression with d.timestamp*/);
        })
const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds))
}
sleep(500).then(() => {
  //do stuff
})