javascript
1コード 2function csvData(dataPath){ 3 //csvデータを読み込みます 4 //そのデータを配列に入れます 5} 6 7function printData(){ 8 //読み込んだデータをHTMLに出力させます。 9} 10 11csvData(dataPath); 12printData();
大まかにはこのようなコードになっています。
順番的にはcsvを読み込んでから、HTMLに出力させているはずなのですが、logなどを使って色々確かめた結果、なんとなくcsvデータを配列に入れる前にprintData()をやっているような感じでした。
結果としては、配列にデータが入っていません、という主旨のエラーが出てきます。
これで最終手段としてはsleepを使わないといけないのかなと、この参考サイトを利用しましたが、うまくいきませんでした。
この問題の解決方法として何かわかる方は教えていただけないでしょうか。よろしくお願いいたします。
ご指摘を受けて
javascript
1コード 2const resultArray = []; //配列を用意 3const vocabPosition = [];//単語の座標(出現回数、平均評価) 4const output_topic = document.getElementById('topik_box'); 5const output_review = document.getElementById("review_box"); 6const output_img = document.getElementById("img_contener"); 7var topicNum; 8 9function csvData(dataPath) { 10 const request = new XMLHttpRequest(); // HTTPでファイルを読み込む 11 request.addEventListener('load', (event) => { // ロードさせ実行 12 const response = event.target.responseText; // 受け取ったテキストを返す 13 if (/^csv/result/.test(dataPath)) {// 14 loadTopic(response); // 15 }else if(/^csv/sumAveBag/.test(dataPath)){// 16 loadVocabPosition(response); 17 } 18 }); 19 request.open('GET', dataPath, true); // csvのパスを指定 20 request.send(); 21} 22//csvデータを配列に入れる 23function loadVocabPosition(data){ 24 const dataString = data.split('\n'); //改行で分割 25 for (let i = 1; i < dataString.length; i++) { //一番最初の行は飛ばす 26 vocabPosition[i] = dataString[i].split(','); 27 } 28} 29//csvデータを配列に入れる 30function loadTopic(data){ 31 const dataString = data.split('\n'); //改行で分割 32 for (let i = 1; i < dataString.length; i++) { //一番最初の行は飛ばす 33 resultArray[i] = dataString[i].split(','); 34 } 35} 36 37//配列の中身をHTMLで出力 38function printVocab() {//トピックを表示する 39 let insertElement = ''; //テーブルタグに表示する用の変数 40 topicNum = resultArray[1].length/2;//トピック数 41 for (var i = 1; i <= topicNum; i++) {// 42 insertElement += "<div class=\"topic_contener\" id=\"topic_"+i+"\">" 43 insertElement += "<div class=\"topic_contener2\">" 44 insertElement += "<div class=\"attribute_contener\">"; 45 for (var j = 1; j <= outputWordsNum; j++) {//一列目は飛ばす 46 insertElement += "<p id=\"atrVoc_"+i+"_"+j+"\">"; 47 insertElement += `${resultArray[j][2*i-1]}`;//属性 48 insertElement += "</p>"; 49 moveVocabPosition(resultArray[j][2*i-1],"atrVoc_"+i+"_"+j); 50 } 51 insertElement += "</div>"; 52 insertElement += "<div class=\"evaluation_contener\">"; 53 for (var j = 1; j <= outputWordsNum; j++) {//一列目は飛ばす 54 insertElement += "<p id=\"evaVoc_"+i+"_"+j+"\">"; 55 insertElement += `${resultArray[j][2*i]}`;//評価 56 insertElement += "</p>"; 57 moveVocabPosition(resultArray[j][2*i],"evaVoc_"+i+"_"+j); 58 } 59 insertElement += "</div>" 60 insertElement += "</div>"; 61 insertElement += "</div>"; 62 } 63 output_topic.innerHTML = insertElement; // 表示 64} 65 66function moveVocabPosition(voc,vocid){ 67 var vocabID = vocabPosition[1].indexOf(voc); 68 var element = document.getElementById(vocid); 69 element.style.position = 'relative'; 70 element.style.left = vocabPosition[vocabID,1]+'px'; 71 element.style.top = vocabPosition[vocabID,2]+'px'; 72} 73 74csvData('csv/sumAveBag.csv'); 75csvData('csv/resultBag.csv'); 76printVocab(); 77
問題はprintVocab()
が配列に格納するより早く読み込んでしまうため、エラーには配列がNULLになってしまいます。
回答1件
あなたの回答
tips
プレビュー