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

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

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

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

814閲覧

JavaScript 非同期処理 thenメソッドの関数スコープの外でAPIのデータを扱うには

Singo109

総合スコア15

スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2019/06/26 14:53

前提・実現したいこと

あるサーバのAPIを使ってクイズアプリを作っているのですが、thenメソッドの外で関数を宣言するとエラーが発生してしまいます。thenメソッドのスコープ内で関数を宣言すると問題なく動作するのですが、スコープの外で宣言する方法を知りたいです。

発生している問題・エラーメッセージ

クイズアプリの処理をする関数を外に出すとdata is not difinedのエラー表示が出ます。

該当のソースコード:

fetch('https://opentdb.com/api.php?amount=10')
.then(response =>{
return response.json();
})
.then(data =>{
setQuiz();
});

言語:JavaScript

ソースコード:

(function(){
'use strict';
const startBtn = document.getElementById('start');
const genre = document.getElementById('genre');
const diff = document.getElementById('difficulty');
const qs = document.getElementById('qs');
const answs = document.getElementById('answers');
const qsNum = document.getElementById('qs-num');
const btn = document.getElementsByClassName('btn');
let score = 0;
let count = 0;
let answsArr = [];

fetch('https://opentdb.com/api.php?amount=10') .then(response =>{ return response.json(); }) .then(data =>{ setQuiz(); }); //クイズをセットする処理 function setQuiz(){ let qsCount = count + 1; genre.innerText = "[ジャンル] " + data.results[count].category; genre.style.display = "block"; diff.innerText = "[難易度] " + data.results[count].difficulty; diff.style.display = "block"; qs.innerText = data.results[count].question; qsNum.innerText = "問題" + qsCount; buildAnsChoises(); } function buildAnsChoises(){ // correct_answerを配列answsArrへプッシュ answsArr.push(data.results[count].correct_answer); //incorrect_answersを配列answsArrへプッシュ for(let i = 0; i < data.results[count].incorrect_answers.length; i ++){ answsArr.push(data.results[count].incorrect_answers[i]) } //answsArrをシャッフル let length = answsArr.length; for(let i = length - 1; i > 0; i --) { let j = Math.floor(Math.random() * (i + 1)); let tmp = answsArr[i]; answsArr[i] = answsArr[j]; answsArr[j] = tmp; } //DOM生成処理 for(let i = 0; i < answsArr.length; i ++){ let dd = document.createElement('dd'); let inp = document.createElement('input'); answs.appendChild(dd); dd.appendChild(inp); inp.type = "button"; inp.className = "btn"; inp.value = answsArr[i]; } //btn押下時処理 for(let i = 0; i < btn.length; i ++){ btn[i].addEventListener('click',function(){ if(this.value === data.results[count].correct_answer){ score ++; count ++; }else{ count ++; } // クイズが終了した時の表示 if(count === 10){ qsNum.innerHTML = "あなたの正解数は" + score + "です!"; qs.innerHTML = "再度チャレンジする場合は以下をクリック"; genre.style.display = "none"; diff.style.display = "none"; } answsArr = []; answs.textContent = []; setQuiz(); }); } }

})();

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

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

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

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

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

KuwabataK

2019/06/26 14:59 編集

とりあえず今のままだと見にくいので、コード部分は以下のようにバッククォート3つで囲んでくれるとありがたいです。いい感じに整形してくれます ``` js // ここにコードを書く ```
guest

回答1

0

ベストアンサー

setQuiz() の引数にdataを取るようにして、呼び出し側で渡せばいいのでは。

投稿2019/06/26 14:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gtracker64

2019/06/26 15:08

``` fetch('https://opentdb.com/api.php?amount=10') .then(response => { return response.json(); }) .then(data => { setQuiz(data); // 引数にdataを渡す }); //クイズをセットする処理 function setQuiz(data) { // 引数を変数名dataで受け取る let qsCount = count + 1; genre.innerText = "[ジャンル] " + data.results[count].category; genre.style.display = "block"; diff.innerText = "[難易度] " + data.results[count].difficulty; diff.style.display = "block"; qs.innerText = data.results[count].question; qsNum.innerText = "問題" + qsCount; buildAnsChoises(); } ```
Singo109

2019/06/28 05:52 編集

ありがとうございます。前に回答頂いた方の時に解決しました。丁寧にありがとうございますm(_ _)m
退会済みユーザー

退会済みユーザー

2019/06/28 07:21 編集

コード書いてくださった方、ありがとうございました。 回答の時点で解決したとのことでおわかりとは思いますが、要はthen()の引数に渡した関数の引数なので、その関数の中でdataを渡すようにしないといけないということです。 .then(function(data){ setQuiz(data); }
Singo109

2019/06/28 10:23 編集

はい、ありがとうございました。引数の使い方がいまいち分かっていませんでした。今回頂いたの回答で以前より理解できたと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問