【问题标题】:Using d3.queue with D3 v5将 d3.queue 与 D3 v5 一起使用
【发布时间】:2020-07-17 21:34:16
【问题描述】:

我知道在 D3 版本 5 中 d3.queue() 已被替换为 Promise,事实上,如果我尝试使用我得到的功能:

d3.queue 不是函数

但我不明白为什么如果我把它放在 html 标头中我不会再收到上述错误,但代码似乎不起作用:

<head>
    <script src="https://d3js.org/d3.v5.min.js"></script>
    <script src="https://d3js.org/d3-queue.v3.min.js"></script>
</head>

【问题讨论】:

    标签: javascript d3.js promise


    【解决方案1】:

    TL;DR:在 D3 v5 中您根本不需要 d3.queue,因为它在内部使用了 Fetch API。因此,您可以只使用Promise.all() 或链接then() 方法。


    您可能知道,d3.queue 旨在用于 D3 v4,而不是 D3 v5。由于 D3 v5 中没有 queue 方法,因此只需尝试 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.csvd3.jsond3.tsv 等没有回调作为第二个(最后一个)参数。取而代之的是,它们返回一个承诺(使用 Fetch API)。

    话虽如此,上面的 sn-p 不仅丑陋而且完全没有必要:只需删除d3.queue

    【讨论】:

    • 谢谢,成功了!现在我想用 Promise 替换这段代码。我已经阅读了你的两个答案,但我无法解决。如果你愿意,你可以在这里帮助我link
    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 2016-06-11
    • 2019-07-10
    • 1970-01-01
    • 2020-07-31
    • 2016-07-24
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多