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

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

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

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

Q&A

解決済

1回答

461閲覧

【JavaScript】functionの外で値を受け取りたい

asakura

総合スコア29

JavaScript

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

0グッド

0クリップ

投稿2017/09/11 13:42

翻訳APIを作成しています。

テキスト入力されたmessageを翻訳APIに引数で渡し、
翻訳結果を戻したいのですが、値が受け取れません。

関数の定義の仕方が悪いのか、見当がつかず、、、。
ご指導頂けないでしょうか。

以下、翻訳APIです。

js

1 // 翻訳API 2 // 文字が入力されたらイベント発火 3 var tranceLang = textTranslator(message); 4 console.log("翻訳結果確認: " + tranceLang); 5 6 function textTranslator(message) { 7 8 // 現在の時刻をUNIX Time に変換して取得 9 const now = new Date(); 10 const nowtime = now.getTime(); 11 12 // 認証トークンを取得するための関数 [getToken] を定義 13 // http://docs.microsofttranslator.com/oauth-token.html 14 const getToken = function() { 15 const defer = $.Deferred(); 16 17 // 現在時刻と、sessionStorageに保存されている時刻を比較 18 // sessionStorageに保存されているトークンが8分以内に発行されたものであれば、そのまままトークンを返す 19 // 8分以上経っている場合、もしくはトークンが存在しない場合、新規にトークンを取得。 20 // 取得したトークン、および取得時間をUNIX Time に変換したデータをJSON [datalist] に格納 21 // sessionStorage [tdata] にJSONを保存する 22 const arr = JSON.parse(sessionStorage.getItem("tdata")); 23 24 if (arr === null || arr.time + 1000 * 60 * 8 < nowtime) { 25 $.ajax({ 26 url: 'https://api.cognitive.microsoft.com/sts/v1.0/issueToken', 27 type: 'POST', 28 headers: { 29 'Content-Type': 'application/json', 30 'Accept': 'application/jwt', 31 'Ocp-Apim-Subscription-Key': '認証キー', 32 }, 33 async: false, 34 }).done(function(data) { 35 36 const datalist = { 37 time: nowtime, 38 token: data, 39 } 40 sessionStorage.setItem('tdata', JSON.stringify(datalist)); 41 }); 42 } 43 44 // sessionStorage に保存されたデータを変数 arr2 に格納 45 // JSONを文字列に変換後、トークンデータを引き出して翻訳用の関数にひきわたす 46 const arr2 = JSON.parse(sessionStorage.getItem("tdata")); 47 const token = arr2.token; 48 defer.resolve(token); 49 return defer.promise(); 50 }; 51 52 // 関数 [getToken] 実行後、取得したトークンを 受け取る 53 // フォームから入力したデータとともに、 Microsoft Translator テキストAPIへ送信 54 $.when(getToken()).done(function(token) { 55 const key = 'Bearer ' + token; 56 const text = message; 57 const response = $.ajax({ 58 url: 'https://api.microsofttranslator.com/v2/http.svc/Translate', 59 type: 'GET', 60 data: { 61 'appid': key, 62 'Accept': 'application/xml', 63 'text': text, 64 'to': 'en', 65 }, 66 async: false, 67 }) 68 69 // Translator テキスト APIを通じて取得したデータから、翻訳語が含まれるプロパティを取得 70 // replace関数でタグを除去し、翻訳データのみを抽出して表示する 71 const data = response.responseText; 72 const translation = data.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, ''); 73 }) 74 }; 75

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

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

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

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

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

MasakazuFukami

2017/09/11 13:52

すいません。どこがどうなっているのかいまいちわからないのと、どの関数に何が出力されないのかがわかりません。また、最初に呼び出してある textTranslator(message)もおそらくmessageはinput type="text"の入力ハンドリングから取得したものだと思いますが、このようなものもこちらで用意しなければならないので、回答者が回答しやすいように、必要な部分だけを残し、再現性のあるコードを記述していただけるとうれしいです!
guest

回答1

0

ベストアンサー

JavaScript

1var tranceLang = textTranslator(message); 2console.log("翻訳結果確認: " + tranceLang);

$.ajax()非同期処理の為、textTranslator() の返り値を受け取る事は出来ません。
コード中にあるように、.done() で結果を受け取って下さい。
関数 textTranslator() の中から、外側の関数を参照する事は可能です。
http://api.jquery.com/jquery.ajax/

Re: asakura さん

投稿2017/09/11 14:03

編集2017/09/11 15:21
think49

総合スコア18162

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

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

asakura

2017/09/11 15:15

質問内容が分かりにくく申し訳ございません。 ご指摘頂いた内容を確認し、ajax内の値が取得できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問