d3.js v5-Promise.all替换为d3.queue

d3.js v5-Promise.all替换为d3.queue,d3.js,promise,queue,D3.js,Promise,Queue,我使用d3.js v4已经有一段时间了,我知道Mike Bostock已经用Promise原生JavaScript对象替换了v5版本中的d3.queue。我想与您确认一下,我编写的这段代码是否正确地(异步地)对这些URL进行排队: var makeRequest = function() { "use strict"; var bli = [ "http://stats.oecd.org/sdmx-json/data/BLI2013/all/all",

我使用d3.js v4已经有一段时间了,我知道Mike Bostock已经用Promise原生JavaScript对象替换了v5版本中的d3.queue。我想与您确认一下,我编写的这段代码是否正确地(异步地)对这些URL进行排队:

var makeRequest = function() {
    "use strict";

    var bli = [
        "http://stats.oecd.org/sdmx-json/data/BLI2013/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI2014/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI2015/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI2016/all/all",
        "http://stats.oecd.org/sdmx-json/data/BLI/all/all"
    ];

    var promises = [];

    bli.forEach(function(url) {
        promises.push(
            new Promise(function(resolve, reject) {
                d3
                    .json(url)
                    .then(function(response) {
                        resolve(response);
                    })
                    .catch(function(error) {
                        console.log("Error on: " + url + ". Error: " + error);
                        reject(error);
                    });
            })
        );
    });

    Promise.all(promises).then(function(values) {
        console.log(values);
    });
};

makeRequest();

代码似乎运行正常,但是,这是正确的代码还是有更好的方法(最佳实践方法)使用Promise.all和d3.js排队?捕获错误是否正确执行?

您可以大大简化该代码:您不需要将
新承诺
d3.json
一起使用,因为
d3.json
本身将创建承诺

所以,你可以这样做:

var files = ["data1.json", "data2.json", "data3.json"];
var promises = [];

files.forEach(function(url) {
    promises.push(d3.json(url))
});

Promise.all(promises).then(function(values) {
    console.log(values)
});
或者,如果你喜欢,甚至更短:

var files = ["data1.json", "data2.json", "data3.json"];

Promise.all(files.map(url => d3.json(url))).then(function(values) {
    console.log(values)
});
由于我无法在S.O.代码段中使用JSON文件,请检查此bl.ocks中的控制台:

以下是使用and的方法:


如果您想根据自己的喜好清理数据,也可以为数据添加格式化功能。 .then()将把数据放在一个漂亮的数组中,以后可以使用

const myData=d3.csv(“data.csv”,formatterFunction)
.然后(数据=>/*做任何事*/)
函数格式化程序函数(行){
//格式化
返回//格式化数据

}
太棒了!但是,如果一个URL出现错误——例如,如果它不存在——承诺不会返回来自其他URL的结果,即使它们是正确的(您的代码和我的代码都会遇到这种情况)。是否有方法从返回数据或Promise.all函数的URL返回值?函数假定不存在任何错误?@MarcoA.Ferra这是另一个问题,具体与
Promise.all()
,而与D3无关。因此,为了避免您的问题“过于宽泛”,我建议您将此问题作为一个新问题发布,使用
promise
标记,而不使用
d3.js
标记。我会这样做。谢谢你上面的正确答案。@MarcoA.Ferra不用担心。还有一个标记,当然也要使用它。@v3nt这太复杂了,无法在评论中回答,我建议你发布一个新问题。我刚刚回滚了这个问题,删除了
d3v5
标记。对于编辑器,请阅读以下内容:。我们在删除
d3v4
标记方面做了大量工作,显然这个过程将从这个新的
d3v5
标记重新开始!这是建议的操作:无论版本如何,问题都应该只有标签。然后,如果问题特定于给定版本,OP必须在标题或问题正文上指定版本。
async function chart() {
  const [first, second] = await Promise.all([
    d3.json('data1.json'),
    d3.json('data2.json'),
  ])
  console.log('data2.json :', second)
}

chart()