You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于D3.js v5用Promise.all替代d3.queue的异步请求代码正确性验证

关于D3.js v5中用Promise替代d3.queue的异步请求确认

嘿,很高兴看到你已经在着手从D3 v4的d3.queue过渡到v5的原生Promise异步处理啦!先给你明确说:你目前贴出的代码片段还缺少实际发起请求和处理异步流程的逻辑,不过我来帮你补全并确认正确的写法~

首先,先把你给出的初始代码片段整理出来:

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..." 
  ]
  // 这里缺少发起请求和处理异步的核心逻辑
}

在D3 v5里,所有数据加载方法(比如d3.json、d3.csv)都已经返回原生Promise了,所以我们完全可以用JavaScript的Promise API来实现和d3.queue一致的异步排队效果,下面给你两种常用的写法:

1. 并行加载(对应d3.queue的并行模式)

如果希望同时发起所有请求,等全部加载完成后再处理结果,用Promise.all就可以实现,这和d3.queue默认的并行行为完全一致:

var makeRequest = async function() { 
  "use strict"; 
  var bliUrls = [ 
    "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" 
  ];

  try {
    // 把每个URL转成d3.json的Promise请求,用Promise.all并行处理
    var allData = await Promise.all(bliUrls.map(url => d3.json(url)));
    // 所有请求成功完成后,allData是对应每个URL的结果数组
    console.log("所有数据加载完成:", allData);
    // 在这里写你的后续业务逻辑,比如渲染可视化等
  } catch (error) {
    // 只要有一个请求失败,就会进入这里捕获错误
    console.error("请求出错啦:", error);
  }
};

// 别忘了调用这个函数
makeRequest();

2. 串行加载(对应d3.queue的串行模式)

如果需要按顺序发起请求,前一个请求完成后再发起下一个,用async/await配合循环就能实现:

var makeRequest = async function() { 
  "use strict"; 
  var bliUrls = [ 
    "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" 
  ];

  var allData = [];
  try {
    for (const url of bliUrls) {
      const data = await d3.json(url);
      allData.push(data);
      console.log(`当前URL ${url} 加载完成`);
    }
    console.log("所有串行请求完成:", allData);
    // 后续逻辑...
  } catch (error) {
    console.error("串行请求出错:", error);
  }
};

makeRequest();

如果不习惯async/await的写法,也可以用传统的Promise链式调用:

var makeRequest = function() { 
  "use strict"; 
  var bliUrls = [ 
    "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" 
  ];

  Promise.all(bliUrls.map(url => d3.json(url)))
    .then(allData => {
      console.log("所有数据加载完成:", allData);
      // 后续操作...
    })
    .catch(error => {
      console.error("请求出错:", error);
    });
};

makeRequest();

总结一下:只要你按照上面的方式补全请求逻辑,就能正确实现这些URL的异步排队处理,完全可以替代d3.queue的功能~

内容的提问来源于stack exchange,提问作者Marco A. Ferra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:34:01