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

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

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

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

Q&A

1回答

711閲覧

Javascript 変数の受け取りがundefindedとなってしまう。

yu_chunbei

総合スコア5

JavaScript

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

0グッド

1クリップ

投稿2021/11/22 08:47

編集2021/11/22 09:20

javascript初心者です。
現在作成しているもので、関数から得た情報を変数に入れて次に進む動作を行いたいと思っています。
しかし、実際に稼働させたところ関数が終了する前に動作が先に行ってしまい、実行結果を受け取れないまま変数の中身がundefindedとなってしまっております。

行いたいことは以下です。
・関数を実行し、値を取得
・その値を持って次に進む

現在確認したこと
・下のfunc1、func2自体はうまくワークしている
・alertを用いて検証した結果、関数(func2)の開始→if文の次の動作が始まってしまう→func2が終了の時間となってしまっており、その分下のresultが取得できずundefindedとなっている

調べるとjavascriptは同期接続が通常で非同期接続をする場合は様々な説明があったのですが同期接続を行う方法を知りたいです。
どうかご教示願います。(尚足りない情報などございましたらコメントいただけましたら幸いです)

・追記
具体的なコードの内容としては、「祝日華道家の判断」となります。
func2で祝日かどうかを判断、その結果を利用して次に進みたいと思っておりました。
func2について
func2では内閣府のが出している近年の祝日をリストアップしたcsvファイルを利用して、指定した日が祝日かどうかを判断する(trueかfalseで結果をだす)というものを作成しております。
データ自体は取れております(指定した日付が祝日かどうか)がその結果をfunc1のif文が取得する前に次に進んでしまっていることもわかっております。

コード

javascript

1 2function func1(){ 3 if(func2("具体的な日付")){ 4//行いたい動作 5} 6 7 //以下からこのfunc2から得た情報を利用して行きたいです 8} 9 10function func2(date) { 11 var req = new XMLHttpRequest(); 12 req.open('get', 'syukujitsu.csv', true); 13 req.send(null); 14 req.onload = function() { 15 //alert(req.responseText) 16 var dataArr = []; 17 var tmp = req.responseText.split('\n'); 18 //alert("-"+date+"-") 19 //alert("-"+tmp[958].split(",")[0].trim()+"-") 20 var result= false 21 for(var i=0; i<tmp.length; i++){ 22 23 if(tmp[i].split(",")[0].trim()===date){ 24 result = true; 25 break 26 } 27 } 28 29 return result 30 } 31 } 32

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

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

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

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

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

Lhankor_Mhy

2021/11/22 08:49

非同期処理の部分をご提示ください。
int32_t

2021/11/22 08:52

function2() の中身を正確に開示してください。
yu_chunbei

2021/11/22 09:12

Lhankor_Mhy様 int32_t様 見ていただきありがとうございます。 内容を表記せず申し訳ありませんでした、function2の内容追加いたします。
guest

回答1

0

func2() にはreturn文はありませんので、func2()の返り値を受け取ると undefined になります。func2() の中で XMLHttpRequest に設定している無名のコールバック関数にはreturn文がありますが、このコールバック関数は非同期に呼ばれるため、このままでは func2() から result を返すことはできません。

対処:

  • func1() の「//行いたい動作」のコードをコールバック関数のreturn resultのところに移動してください。
  • または、async/await を使います。

js

1async function func1(){ 2 if(await func2("具体的な日付")) { 3 //行いたい動作 4 } 5 ... 6} 7 8async function func2(date) { 9 let response = await fetch('syukujitsu.csv'); 10 let tmp = (await response.text()).split('\n'); 11 ... 12 return result; 13}

投稿2021/11/22 15:20

int32_t

総合スコア21695

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問