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

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

詳細はこちら
JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

3回答

1561閲覧

asyncを実行する際に処理を止める方法について

ruuuu

総合スコア176

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2021/01/03 12:30

編集2021/01/03 12:31

asyncを使用した非同期通信で分からない部分があり、質問させて貰いました。
asyncを使用した関数内ではawaitにより、処理を止めることが出来ますが、これをasync関数内だけでなくasyncを実行する際にもレスポンスが返却されるまでは処理を止めたいと思っています。
具体的には、const responsQuizData = getQuizData()ここの部分で、処理を止めておき、responsQuizDatafetchした結果が入った後に、次の処理を行う形にしたいと考えています。
何か、良い方法がありましたら教えて頂けましたら幸いです。

js

1'use strict' 2 3window.addEventListener('DOMContentLoaded', () => { 4 const startButton = document.getElementById('start_button') 5 const titleText = document.getElementById('title') 6 const descriptionText = document.getElementById('description') 7 startButton.addEventListener('click', () => { 8 startButton.remove() 9 titleText.textContent = '取得中' 10 descriptionText.textContent = '少々お待ち下さい' 11 const responsQuizData = getQuizData() 12 console.log(responsQuizData) 13 14 }) 15 const getQuizData = async () => { 16 const respons = await fetch('https://opentdb.com/api.php?amount=10') 17 const data = await respons.json(); 18 // console.log(data.results) 19 // console.log(data) 20 return data 21 } 22 23})

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

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

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

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

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

guest

回答3

0

async関数は、外から見れば「Promiseを返す関数」です。

呼ぶ側もasync関数としてawaitで受ける、あるいは返り値からthenでつないでいく必要があります。

投稿2021/01/03 12:42

maisumakun

総合スコア145963

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

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

ruuuu

2021/01/03 13:08 編集

ご回答ありがとうございます。 > 呼ぶ側もasync関数としてawaitで受ける こちらなのですが、お手数ですが、具体的にどのようにすれば良いか実装コードの方、ご提示頂けましたら幸いです。
guest

0

await というのは Promise (と Thenable)オブジェクトが返ってきたときに処理を待ってくれる演算子です。じゃあ await したければ Promise オブジェクト作っちゃえばいいじゃない。

JavaScript

1const getQuizData = async () => { 2 return new Promise(async (resolve, _reject) => { 3 const respons = await fetch('https://opentdb.com/api.php?amount=10') 4 const data = await respons.json(); 5 resolve(data); 6 }) 7}

こうすると getQuizeData()await できるようになります。詳しくはここ見てね。
Promise - JavaScript | MDN

投稿2021/01/03 12:45

編集2021/01/03 13:06
A_kirisaki

総合スコア2853

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

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

ruuuu

2021/01/03 13:01 編集

ご回答ありがとうございます。 ご提示頂きましたコードを試して見たのですが、「Uncaught SyntaxError: await is only valid in async function」というエラーが「 const respons = await fetch('https://opentdb.com/api.php?amount=10')」ここの部分で発生してしまいました...
ruuuu

2021/01/03 13:16 編集

回答の方、修正頂きありがとうございます。 いまいち「Promise」について理解出来ない部分があるのですが、こちら、ご提示頂きましたコードですと「await」では「getQuizData 」を呼び出している側の処理は止められないが、「Promise」では中の処理が終了するまでは、getQuizDataを呼び出している側でも処理を止める効果がある、といった理解で合っておりますでしょうか...?
A_kirisaki

2021/01/03 13:38

いえ、なんかあさっての方へ行っちゃっとる。await というのは Promise を受け取るとその中に持ってる関数を待つことが出来て、関数が結果を返したければ resolve を使って返す、というそれだけのことです。なので getQuizData を await したければ上述のように Promise で包む必要がある、というわけです。
ruuuu

2021/01/03 15:17 編集

なるほどです... 例えばなのですが、以下のような形ですと、getQuizData()によりfetchした結果のレスポンスが返された後に、「test」が出力される形になるということでしょうか...? console.log(getQuizData()) console.log('test')
A_kirisaki

2021/01/03 15:20

Promise {<pending>} test と表示されます。Promise は await しなければいけません。なので console.log(await getQuizData()) console.log('test') とする必要があります。
ruuuu

2021/01/03 15:29

度々申し訳ないのですが、console.log(await getQuizData())こちらを試して見ましたら、「Uncaught SyntaxError: missing ) after argument list」とのエラーが出力されてしまいました...
A_kirisaki

2021/01/03 15:34

エッ!?実行できたよ?
ruuuu

2021/01/03 15:40

ちょっと気になったのですが、「 await」はasyncの中でしか使用できないのではないでしょうか?
ruuuu

2021/01/03 15:40

そう考えると、「console.log(await getQuizData())」こちらでエラーが出ていた理由も説明がつくかと思います
A_kirisaki

2021/01/03 15:42

あ、それ見落としてました。本当に申し訳ない。addEventListener に渡す関数に async 付けといてください
ruuuu

2021/01/03 15:54 編集

addEventListener に渡しているのも、コールバック関数な為、asyncをつけることができるのですね。 「startButton.addEventListener('click', async () => {」こちらの形で、試してみましたら、エラーなく実行することが出来ました。
ruuuu

2021/01/03 15:56

.addEventListenerのコールバックにasyncを付ける場合ですが、元々のgetQuizData関数でもエラーは出ませんでした。 const getQuizData = async () => { const respons = await fetch('https://opentdb.com/api.php?amount=10') const data = await respons.json(); return data }
guest

0

自己解決

A_kirisakiさんにご助言を頂き、以下の部分にasyncを付け足し、
startButton.addEventListener('click', async () => {
以下の形で、getQuizData()内でfetchした後に、console.log(responsQuizData)の出力を行うことが出来ました。
const responsData = await getQuizData()

投稿2021/01/03 16:01

ruuuu

総合スコア176

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問