2012-11-16 11 views
13

मैं डी 3 का उपयोग कर जावास्क्रिप्ट में अन्य CSV फ़ाइलों की सूची का एक CSV लोड कर रहा हूं।मैं जावास्क्रिप्ट चलाने से पहले डी 3 को कई सीएसवी लोड करने के लिए कैसे सुनिश्चित करूं?

जब मैं निम्नलिखित कोड चलाता हूं, तो कर्मचारी सरणी कोड में तब तक खाली होती है जब तक यह कोड में नहीं पहुंच जाती है। यह सुनिश्चित करने का कोई सही तरीका है कि जावास्क्रिप्ट जारी रखने से पहले डी 3 डेटा लोड करना समाप्त कर देता है?

var employees = []; 

//Retrieve the file list of all the csvs in the data directory, then run a callback on them 
function retrieveList(url,callback) { 
    d3.csv(url,function(data) { 
     callback(data); 
    }) 
} 

//Parse a file list, and then update the employee array with the data within 
function parseList(filenames){ 
    filenames.forEach(function(d) { 
     d3.csv(d.filename,function(data) { 
      data.forEach(function(d) employees.push(d.name)); 
     } 
    } 
} 

//Run this code 
var filenamesUrl = "http://.../filenames.csv" 
retrieveList(filenamesUrl, parseList); 

console.log(employees); //This logs "[]" 

अगर मैं क्रोम, में पृष्ठ लोड जब मैं कंसोल में जाने के लिए और कर्मचारियों को लॉग इन करें, यकीन है कि पर्याप्त यह नाम से भर देता है देता है। आखिरी पंक्ति पर जब मैं console.log (कर्मचारी) चलाता हूं तो मैं उस मामले को कैसे बना सकता हूं?

+1

आप अधिक स्पष्ट रूप से मैं क्या करने की कोशिश कर रहा हूँ देखने के लिए चाहते हैं, तो यह यहाँ है: https: // github.com/mkwng/d3-experiments/ – mkwng

उत्तर

0

आपका कोड ठीक लगता है। डेटा तैयार होने से पहले आप employees लॉगिंग कर रहे हैं। लेकिन अगर आप console.logparseList की अंतिम पंक्ति पर हैं तो आपको यह होना चाहिए।

20

आप queue.js इस्तेमाल कर सकते हैं सभी d3.csv कॉल से परिणाम इकट्ठा करने के लिए:

function parseList(filenames){ 
    var q = queue(); 
    filenames.forEach(function(d) { 
    //add your csv call to the queue 
    q.defer(function(callback) { 
     d3.csv(d.filename,function(res) { callback(null, res) }); 
    }); 
    }); 

    q.await(restOfCode) 
}  

function restOfCode(err, results) { 
    //results is an array of each of your csv results 
    console.log(results) 
}