質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1144閲覧

javascriptの読み込み方教えてください、(sleepができない)

oika77

総合スコア184

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/11/20 09:42

編集2020/11/20 12:05

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になってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2020/11/20 09:46

肝心のコードがすっからかんなので全く分かりませんが、async await promiseあたりで検索すれば解決するでしょう
miyabi_takatsuk

2020/11/20 10:05 編集

Node.jsでしょうか? であるならば、Node.jsの質問タグを追加しましょう。 ブラウザ実行のJavaScriptには、sleepというメソッドは存在しません。 また、 サーバーサイド(Node.js側)で処理を止めたとしても、 フロントエンド側で、非同期処理をしていた場合、 処理が抜かされるので、 hentaimanさんのおっしゃる通り、Promiseなどの仕様を使う必要があります。 なので、フロントエンドの処理も記載ください。
m.ts10806

2020/11/20 11:14

他者がコピペで動作確認できるコードを提示してください。 そのまま提示できないのなら、最小構成のコードで組みなおしてください。 半端なコードとザっと書かれただけの文章で他者が理解するのは無理があります。
oika77

2020/11/20 12:01

すみません。コードを書きました。よろしくお願いいたします。
m.ts10806

2020/11/20 12:05

細かいのですが実際のコードに「コード」という文字は入ってますか? あくまで赤の他人なので、間違って入ったのか本当にそうなっているのか分からないのです。
oika77

2020/11/20 12:07

入っていないです。
hentaiman

2020/11/20 15:10

async await promiseで検索すればというアドバイスは見ましたか?調べましたか? それとも試さずにコード載せただけですか?
oika77

2020/11/20 21:56

コメントしてくださった方々、ありがとうございます! コールバックでうまくいきそうです。
guest

回答1

0

ベストアンサー

(sleepができない)

sleep は必要ありません。
参考にされたサイトは sleep 機能を題材にしていますが、「コールバック関数を受け取る関数」を説明しているだけです。

javascript

1function csvData(dataPath, callback) { 2 // xhr.onload 内で callback( result ) 3} 4 5 6function printData( data ) { 7 // data を処理して HTML を動的更新 8} 9 10csvData(dataPath, printData); // コールバックを第二引数に

dataPath を読んでから printData() が処理されます。
Promise によるフロー制御は、後からでも書き直せるので、まずはコールバック処理を書考えてみてください。

投稿2020/11/20 12:32

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oika77

2020/11/20 21:56

本当にありがとうございます !! そういうことが知りたかったです。そもそもコールバックという概念が自分の中にありませんでした。 うまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問