🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Dialogflow

Dialogflowは、Googleが提供している自然言語対話プラットフォーム。音声入力で自然言語の解析を行ってくれる機能で、対話型アプリを簡単に作成することが可能です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

773閲覧

[JavaScript]他のJSファイルから、letで指定した変数を呼び出す方法

proday

総合スコア4

Dialogflow

Dialogflowは、Googleが提供している自然言語対話プラットフォーム。音声入力で自然言語の解析を行ってくれる機能で、対話型アプリを簡単に作成することが可能です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/03/18 07:33

編集2021/03/19 00:49

前提・実現したいこと

HTMLとJavaScriptを使って、アプリ開発をしております。
他のJSファイルから、letで指定した変数を呼び出す方法を教えてください。
※file2.jsでDialogflow応答結果を呼び出そうとしております。

試したこと

HTML

1<script src="file1.js"></script> 2<script src="file2.js"></script>

・file1.js

JavaScript

1let Dialogflow // Dialogflowからの応答文言 2:(省略) 3 // Dialogflow応答 4 xhr = new XMLHttpRequest(); 5 xhr.open('GET', dialogflowURL, true); 6 7 // サーバからのデータ受信を行った際の動作 8 xhr.onload = function (e) { 9 if (xhr.readyState === 4) { 10 if (xhr.status === 200) { 11    :(省略) 12 Dialogflow = anstext; 13 answer.innerHTML = "<p>" + anstext + "</p>"; // anstextに入っている返答部分を表示させています 14 }else if (IntentName.substr(6,2) == "AI") 15 { 16      :(省略) 17 }else 18 { 19 } 20 } 21 }

・file2.js

JavaScript

1async function savetest() { 2 3 var diaryData = []; 4 diaryData = JSON.parse(localStorage.getItem('diaryData' + year + mon)); 5 var id = 0; 6 if (diaryData == null) { // まだデータがない場合 7 8 var diary = { 9 "id": 0, 10 "date": now, 11 "text": $('textarea[name="text"]').val(), 12 "bbb": await Dialogflow 13 } 14 localStorage.setItem('diaryData' + year + mon, JSON.stringify(diary)); 15 id = 0; 16 } else if (!(Array.isArray(diaryData))) { // データ一件の時(配列じゃないとき) 17 var diary = { 18 "id": 1, 19 "date": now, 20 "text": $('textarea[name="text"]').val(), 21 "bbb": await Dialogflow 22 } 23 var Data = []; 24 Data[0] = diaryData; 25 // 配列に入れる 26 Data.push(diary); 27 id = 1; 28 // 配列をlocalStorageに保存 29 localStorage.setItem('diaryData' + year + mon, JSON.stringify(Data)) 30 } else { //配列でデータが入っている場合(複数データがあるとき) 31 var diary = { 32 "id": diaryData.length, 33 "date": now, 34 "text": $('textarea[name="text"]').val(), 35 "bbb": await Dialogflow 36 } 37 // 配列の最後尾に投稿するデータを追加 38 diaryData.push(diary); 39 // 配列をlocalStorageに保存 40 localStorage.setItem('diaryData' + year + mon, JSON.stringify(diaryData)); 41 id = diaryData.length - 1; 42 } 43}

以上、よろしくお願い致します。

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

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

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

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

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

int32_t

2021/03/18 07:37

提示されたコードだけでしたら、そのまま動くはずです。Dialogflow に何も代入していないので値は undefined ですが。 「応答文言」というコメントからすると、Dialogflow には非同期で何かが代入されて、その値を参照したいということなのでしょうか? もしそうなら、DialogFlowを更新するためのコードも開示してください。
proday

2021/03/18 07:52

> int32_t 様 ご指摘ありがとうございます。 追記させていただきました。 おっしゃる通りです。 非同期で”anstext”で代入されております。 (ここに応答文言が返ってきます。)
guest

回答1

0

ベストアンサー

scriptの閉じタグが閉じるような書き方になってませんが大丈夫ですか?
file1.js が変なスコープを利用せずグローバルに書いているなら
そのままいけるでしょう

//hoge.html

<script src="file1.js"></script> <script src="file2.js"></script>

//hoge.txt

test

//file1.js

const url='hoge.txt';//本来であれば何らかのapi let Dialogflow=fetch(url).then(res=>res.text());

//file2.js

(async()=>{ const diary = { bbb: await Dialogflow }; console.log(diary); })();

投稿2021/03/18 07:43

編集2021/03/19 00:10
yambejp

総合スコア116688

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

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

proday

2021/03/18 08:04

ご指摘ありがとうございます。修正致しました。 実際のコードは閉じております。 このままだと、”undefined”と返ってきてしまうのです。
yambejp

2021/03/18 08:13

それは非同期処理でやっているからですね、xhrでさらに別ソースを とってきているのですか?全体的に何をやりたいか不明です
proday

2021/03/18 08:18

> yambejp 様 Dialogflow応答の処理を質問に追加させていただきました。 Dialogflow応答の結果をfile2.jsで呼び出そうとしております。
yambejp

2021/03/18 09:01 編集

file1でプロミスを返しておいて、file2でawaitで受け取ればいけます //file1.js let Dialogflow=fetch(dialogflowURL).then(res=>res.text()); //file2.js (async()=>{ console.log(await Dialogflow); })();
proday

2021/03/18 09:11

> yambejp 様 ご回答ありがとうございます。 ちなみにですが、(async()=>{~の部分はvar diary = {の前に追加でしょうか。
yambejp

2021/03/18 09:16

awaitはasync内でしか実行できません こんな処理になります (async()=>{ var diary = { bbb: await Dialogflow }; console.log(diary); })();
proday

2021/03/19 00:03

>yambejp 様 ありがとうございます。 やってみたのですが、うまくいかないみたいです。。 後ほどコードの方追加させていただきます。
yambejp

2021/03/19 00:11

本文に4つのファイルを記載しました このまま改変せずにweb上でテストしてみてください うまくいかない場合は、どういう動作をするのか エラーはなにかでていないかを明記ください
proday

2021/03/19 00:20

localstorageを使用しているせいですかね。。
yambejp

2021/03/19 00:24

うーん、次から次へと情報を後出しをしてくるので回答がブレブレです localStrageをどうやってかましているのですか?
proday

2021/03/19 00:50

> yambejp 様 お手数お掛け致しますが、file2.jsのコードを追加いたしましたので、ご確認お願い致します。
proday

2021/03/19 00:52

ちなみにこのコードだと"Connect error"になります。
yambejp

2021/03/19 01:05 編集

file2.jsがsavetest関数にはいっていますが、呼び出されていません ちなみに複数箇所でつかうなら変数におとしておくとよいです (async()=>{ const bbb=await Dialogflow; const diary = { bbb }; console.log(diary); })();
proday

2021/03/19 01:01 編集

>yambejp 様 申し訳ございません。追記漏れでした。 file1.jsの方でsavetest();を呼び出してます。
yambejp

2021/03/19 01:08

file1.jsは先行して呼び出して実行してるのですよね? であればsavetestを実行しようにもfile2.jsが呼び出されてないので 実行できないのでは? もう一度フローを精査してみてください
proday

2021/03/19 01:39

> yambejp 様 逆にfile2.jsを先行して実行してみましたが、connecterrorが出ますね。。 見直したところ、localstorageがasyncLocalStorageではないからかなと思っているのですが、 関係ありますか?
yambejp

2021/03/19 01:47 編集

ちなみに私の回答のソースは動作したのでしょうか? なんでも一足飛びにやらずに、一つ一つ仕様を確認しながら組み込んでみてください それとfile1とfile2がそんなに関係が深いなら、一つにしてしまうほうが現実的ではないでしょうか?
proday

2021/03/19 02:24

>yambejp 様 動作確認できてないです。 原因なんですが、let Dialogflow=fetch(dialogflowURL).then(res=>res.text()); の res.text()部分をURLにそった形に変更してないからですかね。
yambejp

2021/03/19 02:35

同じディレクトリ内にファイル名も変えずに、一言一句なにも足し引きせずコピペで 4つファイルを作成して試してください まずはそこからです
proday

2021/03/24 00:01

>yambejp 様 遅くなり大変申し訳ございません。 ファイルを一緒にすることで、できました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問