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