我知道d3.queue()在D3版本5中已经被Promise取代了,实际上,如果我尝试使用我得到的函数:
D3.队列不是函数
但是,我不明白为什么如果我把它放在html头中,我就不会再得到上面的错误了,但是代码似乎不起作用:
<head>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="https://d3js.org/d3-queue.v3.min.js"></script>
</head>发布于 2020-07-17 00:43:06
TL;DR:您根本不需要D3 v5中的d3.queue,因为它在内部使用取API。因此,您可以只使用诸如Promise.all()或链接then()方法之类的东西。
您可能知道,d3.queue应该与D3 v4一起使用,而不是D3 v5。由于在queue v5中没有D3方法,因此,如预期的那样,只要尝试d3.queue就会导致d3.queue is not a function错误。当你引用迷你库时,错误明显消失了.
值得一提的是,如果将d3.queue 与D3 v5一起使用,则将工作,这不是一个问题:
d3.queue()
.defer(function foo(callback) {
setTimeout(function() {
callback(null, "finished");
}, 100);
})
.await(function(error, message) {
console.log(message);
});<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="https://d3js.org/d3-queue.v3.min.js"></script>
但是,如果出于任何原因,您仍然希望将d3.queue与D3 v5一起用于获取文件,则必须将适当的函数传递给defer,并使用这样的回调(这里使用的是我在网上创建的简单JSON,也就是{foo: 42}):
d3.queue()
.defer(function foo(url, callback) {
d3.json(url).then(function(file) {
callback(null, file)
})
}, "https://api.npoint.io/5b22a0474c99d3049d2e")
.await(function(error, message) {
console.log(message);
});<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="https://d3js.org/d3-queue.v3.min.js"></script>
原因是,与D3 v4或更低版本不同,在D3 v5方法(如d3.csv、d3.json、d3.tsv等)中,没有回调作为第二个(最后)参数。相反,他们返回一个承诺(使用Fetch API)。
尽管如此,上面的片段不仅丑陋,而且完全没有必要:只需删除d3.queue即可。
https://stackoverflow.com/questions/62941644
复制相似问题