如何使用Queue.js和D3.js加载多个文件?

时间:2016-03-19 14:34:16

标签: javascript xml d3.js queue

情况

我正在尝试加载多个xml文件(位于服务器上),而无需声明硬编码文件的名称。为此,我尝试使用d3.queue库https://github.com/d3/d3-queue

我已经实现了xml来强制布局以满足我自己的需求(https://bl.ocks.org/mbostock/1080941),但是有一个关键的缺陷,即我需要手动输入我要加载的xml文件的名称...

重现

鉴于(来自http://learnjsdata.com/read_data.html的调整后的示例):

queue()
  .defer(d3.xml, "/mappings/Customer.hbm.xml")
  .defer(d3.xml, "/mappings/Actor.hbm.xml")
  .await(analyze);

function analyze(error, Customer, Actor) {
  if(error) { console.log(error); }
  // do stuff with Customer data, do stuff with Actor data
}

考虑到我对xml处理的实现:

d3.xml("mappings/Customer.hbm.xml","application/xml", function(error,xml){
    if (error) throw error;
    // do stuff with the data retrieved from Customer.hbm.xml
});

问题

如何以这样的方式组合上面两个片段,以便我不必编写xml硬编码的位置并将所有参数传递给analyze函数?任何朝着正确方向的推动都会非常感激。

在psuedocode中,我尝试编写类似下面的内容(但我无法使其工作):

  1. 函数从mappings文件夹中获取xmls的所有名称(可能使用node.js fs.readdir或fs.readdirSync方法,但我不确定它是如何工作的)
  2. 表示每个xml .defer(d3.xml,nameofxml)
  3. 将所有找到的名称作为参数传递给分析函数
  4. 在Java中我会选择用var ... args来做这个,但我不知道如何在JS中做到这一点。

1 个答案:

答案 0 :(得分:4)

这个问题的确有两个部分:

  1. 如何向客户端JavaScript获取服务器端文件列表?
  2. 简短的回答是你没有没有拥有可以返回该列表的服务器端api。根据您使用的后端,编写一个方法,返回目标目录中文件的JSON数组。您先调用它,获取响应,然后使用队列处理所有响应:

    d3.json('/get/list/of/xml/files', function(error, fileArray){
      var q = d3.queue();
      fileArray.forEach(function(d){
        q = q.defer(d3.xml, d);
      });
      q.await(analyze);
    });
    
    1. 如何在JavaScript中处理可变数量的参数?
    2. 这实际上是very well supported in JavaScript

      function analyze(error) {
        if(error) { console.log(error); }
      
        // skip 0 it's error variable
        for (i = 1; i < arguments.length; i++) {
          var xml = arguments[i];
          ...
        }
      }