这里有两个主要问题:
我们想要并行加载文件
由于这些文件是并行加载的,因此我们不知道它们的加载顺序。我想解析每个文件名中的一个键,将d3.csv解析的文件内容数组作为相应的值
就是说,返回的结果是
q.awaitAll(function(error, results) { console.log("all done!"); });
应该是
results={
"key1":array_read_from_myData_key1.csv,
"key2":array_read_from_myData_key2.csv,
...
"key30":array_read_from_myData_key30.csv
}
如何将每个文件名作为键添加到下面的每个数组(results [i])?
var q = queue(), // create the queue
dataSources = [ // the data sources
'myData_key1.csv',
'myData_key2.csv',
'myData_key3.csv',
...,
'myData_key30.csv'
];
// Go through each data source and add it to the queue:
dataSources.forEach(function (source) {
q.defer(function (callback) {
d3.csv(source, callback);
});
});
// Wait for all requests to be completed:
q.awaitAll(function (error, results) {
console.log(results);
})
答案 0 :(得分:1)
你可以在这里扩展你的电话:
dataSources.forEach(function (source, index) {
q.defer(function (callback) {
d3.csv(source, function(data){
var fileData = {
name: dataSources[index],
data: data
};
callback(fileData);
});
});
});
根据您的评论,您可以尝试执行以下操作,但不能100%确定它会起作用:
var finalData = {};
dataSources.forEach(function (source, index) {
q.defer(function (callback) {
d3.csv(source, function(data){
if (data) {
//regex the key from file name
var matcher = /^(myData)_([a-z][a-z][a-z][0-9])\.csv$/;
var key = matcher.exec(dataSources[index])[1];
//assign value to external object
finalData[key] = data;
//callback success
callback(true);
}
else {
//log error if required
callback(false);
}
});
});
});
// Wait for all requests to be completed:
q.awaitAll(function (error, results) {
console.log(finalData);
})
希望这能解决您的问题。