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

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

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

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

HTML

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

Q&A

2回答

814閲覧

クイズ問題でのエラーハンドリングについて

asao112

総合スコア12

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2021/08/10 08:30

編集2021/08/10 09:21

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
JavaScriptとHTMLを使った10回クイズの問題を作っているさいのエラーハンドリング
を行いたいのですがうまくいきません。

該当のソースコード

JavaScript

1{ 2  const API_URL = 'https://opentdb.com/api.php?amount=10'; 3 4  class Quiz { 5   constructor(quizData) { 6    this._quizzes = quizData.results; 7    this._correctAnswersNum = 0; 8   } 9 10   getQuizCategory(index) { 11    return this._quizzes[index - 1].category; 12   } 13 14   getQuizDifficulty(index) { 15    return this._quizzes[index - 1].difficulty; 16   } 17 18   getNumOfQuiz() { 19    return this._quizzes.length; 20   } 21 22   getQuizQuestion(index) { 23    return this._quizzes[index - 1].question; 24   } 25 26   getCorrectAnswer(index) { 27    return this._quizzes[index - 1].correct_answer; 28   } 29 30   getIncorrectAnswers(index) { 31    return this._quizzes[index - 1].incorrect_answers; 32   } 33 34   countCorrectAnswersNum(index, answer) { 35    const correctAnswer = this._quizzes[index - 1].correct_answer; 36    if (answer === correctAnswer) { 37     return this._correctAnswersNum++; 38    } 39   } 40 41   getCorrectAnswersNum() { 42    return this._correctAnswersNum; 43   } 44  } 45 46  const titleElement = document.getElementById('title'); 47  const questionElement = document.getElementById('question'); 48  const answersContainer = document.getElementById('answers'); 49  const startButton = document.getElementById('start-button'); 50  const genreElement = document.getElementById('genre'); 51  const difficultyElement = document.getElementById('difficulty'); 52 53  startButton.addEventListener('click', () => { 54   startButton.hidden = true; 55   fetchQuizData(1); 56  }); 57 58  const fetchQuizData = async (index) => { 59   titleElement.textContent = '取得中'; 60   questionElement.textContent = '少々お待ち下さい'; 61 62 63   const response = await fetch(API_URL); 64   const quizData = await response.json(); 65   const quizInstance = new Quiz(quizData); 66   setNextQuiz(quizInstance, index); 67  }; 68 69  const setNextQuiz = (quizInstance, index) => { 70   while (answersContainer.firstChild) { 71    answersContainer.removeChild(answersContainer.firstChild); 72   } 73 74   if (index <= quizInstance.getNumOfQuiz()) { 75    makeQuiz(quizInstance, index); 76   } else { 77    finishQuiz(quizInstance); 78   } 79  }; 80 81  const makeQuiz = (quizInstance, index) => { 82   titleElement.innerHTML = `問題 ${index}`; 83   genreElement.innerHTML = `【ジャンル】 ${quizInstance.getQuizCategory(index)}`; 84   difficultyElement.innerHTML = `【難易度】 ${quizInstance.getQuizDifficulty(index)}`; 85   questionElement.innerHTML = `【クイズ】${quizInstance.getQuizQuestion(index)}`; 86 87   const answers = buildAnswers(quizInstance, index); 88 89   answers.forEach((answer) => { 90    const answerElement = document.createElement('li'); 91    answersContainer.appendChild(answerElement); 92 93    const buttonElement = document.createElement('button'); 94    buttonElement.innerHTML = answer; 95    answerElement.appendChild(buttonElement); 96 97    buttonElement.addEventListener('click', () => { 98     quizInstance.countCorrectAnswersNum(index, answer); 99     index++; 100     setNextQuiz(quizInstance, index); 101    }); 102   }); 103  }; 104 105  const finishQuiz = (quizInstance) => { 106   titleElement.textContent = `あなたの正答数は${quizInstance.getCorrectAnswersNum()}です` 107   genreElement.textContent = ''; 108   difficultyElement.textContent = ''; 109   questionElement.textContent = '再チャレンジしたい場合は下をクリック'; 110 111   const restartButton = document.createElement('button'); 112   restartButton.textContent = 'ホームに戻る'; 113   answersContainer.appendChild(restartButton); 114   restartButton.addEventListener('click', () => { 115    location.reload(); 116   }); 117  }; 118 119  const buildAnswers = (quizInstance, index) => { 120   const answers = [ 121    quizInstance.getCorrectAnswer(index), 122    ...quizInstance.getIncorrectAnswers(index) 123   ]; 124   return shuffleArray(answers); 125  }; 126 127  const shuffleArray = ([...array]) => { 128   for (let i = array.length - 1; i >= 0; i--) { 129    const j = Math.floor(Math.random() * (i + 1)); 130    [array[i], array[j]] = [array[j], array[i]]; 131   } 132   return array; 133  }; 134 }

html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>Document</title> 8</head> 9<body> 10 <div class="container"></div>  11 <h1 id="title">ようこそ</h1> 12 <h4 id="genre"></h4> 13 <h4 id="difficulty"></h4>  14 <p id="question"><hr>以下のボタンをクリック<hr></p> 15 <button id="start-button">開始</button>     16 </div> 17 <div id="answers"></div> 18<script src="app.js"></script> 19</body> 20</html>

###エラーハンドリングをしたいと思われる箇所

  const response = await fetch(API_URL);   const quizData = await response.json();   const quizInstance = new Quiz(quizData);

試したこと

以下のコードのように成功時のコードを記述の欄にそのま該当コード
を記述してみましたがUncaught SyntaxError: Identifier 'response' has already been declared
とエラーが出てしまいました

fetch(API_URL, { method: 'GET' }) .then(response => { if (!response.ok) { console.error('サーバーエラー'); }         //成功時のコードを記述  const response = await fetch(API_URL);   const quizData = await response.json();   const quizInstance = new Quiz(quizData); }) .catch(error => { console.error('通信に失敗しました', error); });

また新しくコードを書いてみましたが何も変化が起きず成功したいるのか、
分かりません。

fetch('https://opentdb.com/api.php?amount=10') .then((response) => response.text()) .then((text) => console.log(text)) .catch((error) => console.log(error)); fetch('file.txt') .then((response) => { if(response.ok) { // ステータスがokならば return response.text(); // レスポンスをテキストとして変換する } else { throw new Error(); } }) .then((text) => console.log(text)) .catch((error) => console.log(error));   setNextQuiz(quizInstance, index);

上手にエラーハンドリングできる方法を教えていただきたいです

補足

まだ始めたばかりで頭の悪い質問のなってしまい申し訳ございません
ヒントでも良いのでおしえもらいたいです。

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

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

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

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

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

K_3578

2021/08/10 08:31

不具合か何かで同様の質問を2つ投稿してしまっているようなので、当質問は 削除リクエストを送って頂けると有難いです。
K_3578

2021/08/10 08:34

削除リクエストは質問の高評価/低評価数が表示されている箇所にあるゴミ箱マークから送信する事が出来ます。
asao112

2021/08/10 08:54

すみません。すぐに削除します。ありがとうございます
mather

2021/08/10 09:03

「うまく作動しませんでした」という記載は曖昧です。「期待していた動作」「実際の問題のある動作」を記載して問題を明確にしましょう。 ブラウザの開発者ツールを開いてconsoleを確認してください。動作したときのログが出力されていますか?
asao112

2021/08/10 09:22

すみませんUncaught SyntaxError: Identifier 'response' has already been declaredこのようなエラーが出てしまいました
mather

2021/08/10 09:29

エラーメッセージを翻訳して意味を理解しましたか?
asao112

2021/08/10 09:33

捕捉されていない構文エラー: 識別子「response」はすでに宣言されています という意味でした
Lhankor_Mhy

2021/08/10 09:34

「エラーハンドリング」という言葉を「デバッグ」という意味で使っていますか?
asao112

2021/08/10 09:37

Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules すみませんエラーの内容はこちらでした 意味がUncatchedSyntaxError:waitは非同期機能およびモジュールのトップレベルボディだけで有効です。 という意味でした
mather

2021/08/10 09:42

私の方で意味は理解しているので、単に翻訳して教えてほしいのではなく「あなた自身が構文エラーの意味を理解しているか」を聞きたいのです。エラーの意味が理解できないのであれば「わからない」と書きましょう。
asao112

2021/08/10 09:47

すみません理解できませんでした
mather

2021/08/10 09:58

「エラーハンドリング」というのは通常、正常な実行時に発生した問題に対して適切な処理(やり直す、エラーを画面に表示する、など)の意味で用いられます。 開発中の「うまく動作しない状況を解消したい」という意味では「デバッグ」という用語を使ったほうが良いでしょう。
asao112

2021/08/10 10:00

はい。分かりました。気をつけます
asao112

2021/08/10 10:01

わざわざ教えていただきましてありがとうございます。
Lhankor_Mhy

2021/08/11 01:25

ああ、すみません、理解できました。 本当に「エラーハンドリング」をしたいのですね。 把握しました。
Lhankor_Mhy

2021/08/11 01:31

当方の環境で試したところ、matherさんのご回答のコメントでご提示になっているコードで(エラーハンドリングができているかどうかはともかく)とりあえず動くようです。 どのような点に問題を感じていますか?
guest

回答2

0

Uncaught SyntaxError: Identifier 'response' has already been declared

response はすでに宣言されています」と書かれています。

js

1fetch(API_URL, { 2 method: 'GET' 3}) 4.then(response => { // response 変数が使われている 5 if (!response.ok) { 6 console.error('サーバーエラー'); 7 } 8    //成功時のコードを記述 9 const response = await fetch(API_URL); // response を宣言しているがすでに同名の変数がある 10 const quizData = await response.json(); 11 const quizInstance = new Quiz(quizData); 12}) 13.catch(error => { 14 console.error('通信に失敗しました', error); 15});

内容はこういうシンプルなエラーです。

また、 await に関してはこういったページを調べてみると良いでしょう。
非同期関数 - MDN

太字で以下の注意書きが書かれています。

キーワード await は、非同期関数の中でのみ有効です。非同期関数の外で使用した場合は SyntaxError となります。

今回該当しているのがこちらです。

投稿2021/08/10 09:55

mather

総合スコア6753

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

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

asao112

2021/08/10 10:29

``` const response = await fetch(API_URL);  ``` こちらはいらないということでしょうか それと非同期関数の中でしかawaitは有効のならないということは、 async function宣言に直したほうがいいという子でしょうか? 理解の悪い質問で申し訳ございません、
mather

2021/08/10 10:35

すでに書いたとおり、 response という変数名が重複しています。変数名は自由に設定できるので好きな名前に変えれば良いと思いますよ。 「API_URLへのアクセスが必要かどうか」はあなたの判断次第です。私には内容がわかりません。 async/awaitをどのように実装するかはあなた次第です。まずは試してみてから不明な点を聞いてください。 何から始めていいのかわからないような状況であれば、そもそもこの内容はあなたには難しすぎると思います。非同期関数の書き方の基礎からしっかり勉強し直したほうが良いと思います。
asao112

2021/08/10 10:40

fetch(API_URL, { method: 'GET' }) .then(async (response1) => { //response 変数が使われている if(!response1.ok){ consol.error('サーバーエラー'); } //成功時のコードを記述 const response = await fetch(API_URL); //responseを宣言しているがすでに同名の変数がある const quizData = await response.json(); const quizInstance = new Quiz(quizData); setNextQuiz(quizInstance, index); }) .catch(error => { console.error('通信に失敗しました', error); });
asao112

2021/08/10 10:41

すみませんそうですよね、大変ご迷惑をかけてしまい申し訳ありません。 一応変数名を変え、asyncにしてみました
mather

2021/08/10 10:45

もう一度冷静になって、書いているコードが何を実行しているのか一つ一つじっくり意味を理解してください。コピーして持ってきたものでは動きません。 特に、fetch(API_URL) については自分で気づいてもらいたいので敢えてコメントしませんでしたが、すでに同じことを実行していませんか?
guest

0

現在のコードはこんな感じです

JavaScript

1{ 2 const API_URL = 'https://opentdb.com/api.php?amount=10'; 3 class Quiz { 4 constructor(quizData) { 5 this._quizzes = quizData.results; 6 this._correctAnswersNum = 0; 7 } 8 getQuizCategory(index) { 9 return this._quizzes[index - 1].category; 10 } 11 getQuizDifficulty(index) { 12 return this._quizzes[index - 1].difficulty; 13 } 14 getNumOfQuiz() { 15 return this._quizzes.length; 16 } 17 getQuizQuestion(index) { 18 return this._quizzes[index - 1].question; 19 } 20 getCorrectAnswer(index) { 21 return this._quizzes[index - 1].correct_answer; 22 } 23 getIncorrectAnswers(index) { 24 return this._quizzes[index - 1].incorrect_answers; 25 } 26 countCorrectAnswersNum(index, answer) { 27 const correctAnswer = this._quizzes[index - 1].correct_answer; 28 if (answer === correctAnswer) { 29 return this._correctAnswersNum++; 30 } 31 } 32 getCorrectAnswersNum() { 33 return this._correctAnswersNum; 34 } 35} 36const titleElement = document.getElementById('title'); 37const questionElement = document.getElementById('question'); 38const answersContainer = document.getElementById('answers'); 39const startButton = document.getElementById('start-button'); 40const genreElement = document.getElementById('genre'); 41const difficultyElement = document.getElementById('difficulty'); 42startButton.addEventListener('click', () => { 43 startButton.hidden = true; 44 fetchQuizData(1); 45}); 46const fetchQuizData = async (index) => { 47 titleElement.textContent = '取得中'; 48 questionElement.textContent = '少々お待ち下さい'; 49 const response = await fetch(API_URL); 50 const quizData = await response.json(); 51 const quizInstance = new Quiz(quizData); 52 fetch('https://opentdb.com/api.php?amount=10') 53 .then((response) => response.text()) 54 .then((text) => console.log(text)) 55 .catch((error) => console.log(error)); 56 fetch('file.txt') 57 .then((response) => { 58 if(response.ok) { // ステータスがokならば 59 return response.text(); // レスポンスをテキストとして変換する 60 } else { 61 throw new Error(); 62 } 63 }) 64 .then((text) => console.log(text)) 65 .catch((error) => console.log(error)); 66 setNextQuiz(quizInstance, index); 67}; 68const setNextQuiz = (quizInstance, index) => { 69 while (answersContainer.firstChild) { 70 answersContainer.removeChild(answersContainer.firstChild); 71 } 72 if (index <= quizInstance.getNumOfQuiz()) { 73 makeQuiz(quizInstance, index); 74 } else { 75 finishQuiz(quizInstance); 76 } 77}; 78const makeQuiz = (quizInstance, index) => { 79 titleElement.innerHTML = `問題 ${index}`; 80 genreElement.innerHTML = `【ジャンル】 ${quizInstance.getQuizCategory(index)}`; 81 difficultyElement.innerHTML = `【難易度】 ${quizInstance.getQuizDifficulty(index)}`; 82 questionElement.innerHTML = `【クイズ】${quizInstance.getQuizQuestion(index)}`; 83 const answers = buildAnswers(quizInstance, index); 84 answers.forEach((answer) => { 85 const answerElement = document.createElement('li'); 86 answersContainer.appendChild(answerElement); 87 const buttonElement = document.createElement('button'); 88 buttonElement.innerHTML = answer; 89 answerElement.appendChild(buttonElement); 90 buttonElement.addEventListener('click', () => { 91 quizInstance.countCorrectAnswersNum(index, answer); 92 index++; 93 setNextQuiz(quizInstance, index); 94 }); 95 }); 96}; 97const finishQuiz = (quizInstance) => { 98 titleElement.textContent = `あなたの正答数は${quizInstance.getCorrectAnswersNum()}です` 99 genreElement.textContent = ''; 100 difficultyElement.textContent = ''; 101 questionElement.textContent = '再チャレンジしたい場合は下をクリック'; 102 const restartButton = document.createElement('button'); 103 restartButton.textContent = 'ホームに戻る'; 104 answersContainer.appendChild(restartButton); 105 restartButton.addEventListener('click', () => { 106 location.reload(); 107 }); 108}; 109const buildAnswers = (quizInstance, index) => { 110 const answers = [ 111 quizInstance.getCorrectAnswer(index), 112 ...quizInstance.getIncorrectAnswers(index) 113 ]; 114 return shuffleArray(answers); 115}; 116const shuffleArray = ([...array]) => { 117 for (let i = array.length - 1; i >= 0; i--) { 118 const j = Math.floor(Math.random() * (i + 1)); 119 [array[i], array[j]] = [array[j], array[i]]; 120 } 121 return array; 122}; 123}

投稿2021/08/10 08:41

asao112

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問